C语言指针部分 入门 有题求教

作者&投稿:井疤 (若有异议请与网页底部的电邮联系)
刚学习c语言指针部分 有几个问题请教~

1 一个程序 定义了一个二维数组 然后输出 printf(“%d
",*a)
请问这个*a算指针吗,为什么在程序开头并没有去定义这个*a 不如 int *a

因为数组就可以理解成一个指针 像int a[] 这也可以这么写 int * a; 因为数组名字 就是这个数组的首地址 可以用指针的形式来访问操作数组

2 比如定义一个指针 int *p 那这个指针p初始时是不是系统会让他指向一个默认的内存区域。
就好比int a 如果不去给它赋初值 在输出时它还是有数据的 只不过是不可控的
如果定义了一个指针 不给他初始化的情况 它指向了一片垃圾内存 有地址 但是没有内存 输出的东西也是垃圾 无用的信息 要用指针一定要初始化 用完释放内存 这个东西非常危险

你的输入函数shuru()里把数组a[]定义在函数体内,运行的时候由于这是一个局部变量会将它存放到函数栈里,函数返回的时候会把这个函数用到的栈的内容清除,所以你得到的int* a指向的内容是不确定的,不会是你输入的数据。
你应该将数组a定义在函数体外成为一个全局变量

我一行一行给你分析语句吧

根据代码,申请的指针类型、数组类型都是int型,这个不用多说了哈。

第一行:
1.定义了一个2行3列的数组a[][],并且对其赋值。
2.定义了一个1行2列指针数组s[],就相当于这个指针数组由两个指针s[0],s[1]组成啦。
3.定义了一个指向指针的指针pp,你可以把它当做一个二维数组名来看待。pp是个指针,它里面保存另一个指针的地址(即*pp也是一个指针而不是一个具体的值,就像a[0]指向一个二维数组的一行,但是a[0][0]才是一个具体的值一样);*pp是个指针,它里面保存了一个具体的内存单元的地址(即*pp指向这个内存单元,**pp是一个具体的值)。
4.定义了一个很普通的指针p,它里面存了一个具体的内存单元的地址,即*p是一个具体的值。

第二行:
1.让指针s[0]指向a[0]这一行的行首。
2.让指针是s[1]指向a[1]这一行的行首。
这样就让s指向了a[][]数组。

第三行:
让pp与s指向同一个单元。即pp也指向a[][]数组。

第四行:
开辟一个内存空间,让指针p指向它,即p保存着这个内存空间的地址。

第五行:
让**pp的值等于s[1][1],因为s[1]指向a[1]行首,即s[1][0]=a[1][0]=7,s[1][1]=a[1][1]=9,所以,*pp的值等于9。

第六行:
让p与*pp指向同一内存单元,由第五行得知,*(*pp)的值为9,则*p的值也是9喽。

第七行:
把那个9给输出来了。

main()
{int a[2][3]={1,3,5,7,9,11},*s[2],**pp,*p;//把分成了两行3列,
s[0]=a[0],s[1]=a[1];// a[0]={1,3,5},a[1]={7,9,11}
pp=s;
p=(int*)malloc(sizeof(int));
**pp= s[1][1];//s[1]={7,9,11},s[1][1]=9
p=*pp;
printf("%d\n",*p);
}

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
int a[ 2 ][ 3 ] = { 1, 3, 5, 7, 9, 11 }, *s[ 2 ], **pp, *p;
//定义数组a[ 0 ][ 0 ],a[ 0 ][ 1 ],a[ 0 ][ 2 ]依次为1,3,5
//定义数组a[ 1 ][ 0 ],a[ 1 ][ 1 ],a[ 1 ][ 2 ]依次为7,9,11
//定义指针数组*s[ 2 ]、指针**pp和指针*p

s[ 0 ] = a[ 0 ], s[ 1 ] = a[ 1 ];//令指针数组等于数组a对应值
//s[ 0 ]和s[ 1 ]的本身值为a[ 0 ][ 0 ]和a[ 1 ][ 0 ]的地址
//s[ 0 ][ 0 ],s[ 0 ][ 1 ],s[ 0 ][ 2 ]依次为1,3,5
//s[ 1 ][ 0 ],s[ 1 ][ 1 ],s[ 1 ][ 2 ]依次为7,9,11
//*s[ 0 ]和*s[ 1 ]依次为1,7即s[ 0 ][ 0 ]和s[ 1 ][ 0 ]
pp = s;//把s[ 0 ]的地址赋于pp
p = ( int* )malloc( sizeof( int ) );//p为新申请整型指针的内存地址

**pp = s[ 1 ][ 1 ];//此时重新赋值
//此时pp值为s[ 1 ]的地址,所以*pp等于s[ 1 ]的值,也是a[ 1 ][ 1 ]的地址
//所以**pp为s[ 1 ]的指向值,也是a[ 1 ][ 1 ]的值9
p = *pp;//p等于*pp即为上面阐述的*pp等于s[ 1 ]的值
//所以p的值就为s[ 1 ]的值,也是a[ 1 ][ 1 ]的地址
printf( "%d\n", *p );//所以*p就和**pp一样了哦~~~~~~~~

system( "pause" );//系统暂停
return 0;
}


胶州市18640595607: C语言中,关于指针的基础问题,望有高人指点 -
晏备晴达: 指针也是一种数据类型,所以在C中也必须先定义在使用.和其他的定义一样如整型(int),指针类型的也可以在定义时赋值,就是这样int *p=&i1,但是如果去掉类型说明int该语句不成立.p=&i1是赋值语句,使用前必须定义p为指针类型.int *p=&i1是声明语句,包含两层一定义p为整型指针,二将p赋值为&i1.你可以比较着int a=1000;和a=1000;这两个语句不要被*和&弄晕了!

胶州市18640595607: 刚学习c语言指针部分 有几个问题请教 -
晏备晴达: 1 一个程序 定义了一个二维数组 然后输出 printf(“%d\n",*a) 请问这个*a算指针吗,为什么在程序开头并没有去定义这个*a 不如 int *a 因为数组就可以理解成一个指针 像int a[] 这也可以这么写 int * a; 因为数组名字 就是这个数组的首地址 可以...

胶州市18640595607: C语言中的指针请教 -
晏备晴达: 1.对于这个问题,我给你举个实例吧.一般旅店呢有很多房间,店主一般会在分别编号,这个编号就是各个门的地址了,我们再把各个号码贴在钥匙上,通过钥匙就可以访问各个房间了,而钥匙这个时候就相当于访问的指针了,他上面的门牌号...

胶州市18640595607: 关于C语言指针的一道入门编程题! -
晏备晴达: #include<stdio.h> int my_strlen(const char * str) { int len = 0; while(*str != '\0') str++,len++; return len; } void main(void) { char str[50]; printf("Please input a string:"); scanf("%s",str); printf("The length of this string is %d\n", my_strlen(str)); }

胶州市18640595607: C语言中的指针部分如何入门?
晏备晴达: B : i = p; 试图把 p 的地址赋给 i 但是i是整形. 而p是整形指针. C: i = *p; p没有得到值,也没有给p一个明确的地址. D: p = 2*p + 1 这个错的离谱了= = 建议去看清华大学出版社谭浩强的C程序设计. 指针讲的蛮细致.

胶州市18640595607: C语言高手请指教...关于指针方面的如题 谢谢了 -
晏备晴达: 第一个问题我不知道你说的字面值指针常量是什么 第二个其实是这样的 在你定义了一个整型变量并赋初值以后在程序的编译过程中就会把你所定义的变量名转化为该变量的地...

胶州市18640595607: 你们好,我是一个C语言的菜鸟,有关指针运算的问题想请教: -
晏备晴达: 设p为指针变量.(int)p 之后就可以把它看成是一个整型变量了,可以进行任意的运算.不过会有警告.

胶州市18640595607: 关于C语言指针的一道入门编程题.
晏备晴达: #include<stdio.h> void main(){ void move(int[20],int,int); int nember[20],n,m,i; printf("how many number?"); scanf("%d",&n); printf("input %d number:\n",n); for(i=0;i<n;i++) scanf("%d",&number[i]); printf("how many place you want move?...

胶州市18640595607: 帮忙解答下C语言基础指针问题 -
晏备晴达: int *p=&c 相当于 int *p; p=&c; 这还真不好说 指针是c的精华也是难点 定义的时候 要做申明 *p表示这是个关于p的指针当然对应的就是地址&c 但是定义之后 用的时候 *p就表示p这个指针的首地址上的数据 说的我都有点绞了 多看看例子

胶州市18640595607: 求C语言中指针的用法 -
晏备晴达: 电脑程序中,不管是什么东西,他都对应有一个地址,而指针的作用是指向这个地址.例如int a=0; a的内容是0,但是在电脑中的内存地址就是其他,假如是2000,那么指针指向的就是这个2000的值.继续刚才的例子int *p;p=&a;这个时候p就指向了a的地址2000,如果想借助p来访问a,就需要在p前面添加上*号,如*p的内容就是0了,也是a的内容.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网