c语言指针和数组

来源:百度知道 编辑:UC知道 时间:2024/07/02 01:21:53
我现在接触到数组和指针,一维数组用指针来定义和赋值都比较清楚,但是到二维数组就有的地方不清楚了,现在请哪位真正比较清楚的高手讲一下,最好能从更高更深的角度来说说,我宁愿琢磨也不想含糊过去。。。真是谢谢您们了。。。
这样,我首先定义一个二维数组a[3][4],
首先用指向元素的指针的,即int *p;
然后赋给初值,p=a[0],这样是可行的,但是p=a,为啥就不行,不都是隐含了第一行第一列的数的地址么?如果说a[0][0],是第一个元素的值,那么可以接受a[0]是他的地址,但是,这个时候a,代表什么啊,地址的地址?我一个同学说,实际上a[0]和a的物理内存地址是一样的,我也迷糊,不知他说的对么?

然后是用指向一维数组的指针,int (*p)[4],谈后就是给他赋值,这里,对p赋值就可以是p=a了,而如果p=a[0],就不行了,这我也是不明白,p是第一行的数组的地址,如果*((*p)+j)代表的是第一行的某个元素的话,那么,*p不就可以理解为*p+0么?换句话说,不就是第一行第一个元素的地址么?那么这不也就是a[0]么?为啥就不行呢??

我想了好半天,本来觉得指针的学习还算顺,但这里又迷糊了- -!。。。。求高手们给与详解。。。真是万分感谢!!!
虽然我没多少悬赏分了。。。。
上面后半部分我自己写着写着就明白了,刚才没注意,,,等于*p才是第一行第一个数的地址,即*p才能等于a[0],这样就明白了对p赋值就是a了,那这样可不可以理解就是说,第一个问题那里,a隐含的意思就是,第一行的首元素的地址的地址。。。。这样对么?
还请高手指导!!!谢啦

C的多维数组与指针确实是一个比较令人迷惑的问题。数组名是一个地址,实际上,a、a[0]以及&a[0][0]的值是一样的,但这并不是说它们三者是一样的。我们知道指针是有类型的,int *p和int (*p)[4]是不一样的,同样,我们可以认为地址也是有类型的(虽然这样说可能有点不恰当),只有相应类型的地址和指针才可以匹配,我们可以把二维数组a看成一个一维数组,它的每一个元素是一个int〔4〕的一维数组,因此a的“类型”是int〔4〕*,所以只能与int (*p)[4]匹配。而a[0]是一个一维数组,它的元素类型是int,因此a〔0〕的“类型”是int*,和int *p匹配。换句话说,值相等并能说明二者相同。可以参考谭浩强<<C程序设计>>多维数组与指针一节

如果定义int *p=&a[0][0],int (*q)[4]=a,我们如果用printf输出p和q的值,可以看到二者的值是相等的,但是显然p和q不是一样的,直接体现在我们进行p++和q++操作时指针移动的字节数是不一样的

不是,
a和a[0]是同一个地址
你可以用printf("%p %p",a,a[0]);输出看到是一样的。
int *p=a;的赋值方法不是不行,只是编译器给出了一个警告信息,'int *' differs in levels of indirection from 'int (*)[3],
程序依然可以运行。

定义了数组a[3][4]后 p=a ;代表的意思就是将这个数组的首地址赋值给了p 这里懂不?