关于指针问题,请看代码,大神能否解释下代码中的疑问
#include <stdio.h>int main(void)
{ int *o;
int i=3;
o=&i;
printf("*o:%d\n",*o);
printf("o:%p\n",o);
printf("o:%d\n",o);
int array={{1,2,3},{4,5,6}};
int (*p)=array;
printf("*p:%d\n",*p);//疑问这里的*p和上面的*o写法一样,为什么上面是取该指针变量指向的值,底下*p是存放的指针(地址)
printf("*p:%p\n",*p);
printf("*(*p):%d\n",*(*p));
printf("**(p+1):%d\n",**(p+1));
return 0;
}
运行结果:
*o:3
o:000000000061FE0C
o:6422028
*p:6422000
*p:000000000061FDF0
*(*p):1
**(p+1):4 p是指向指针的指针,也就是说p指向的地址中的值是另一个指针,另一个指针所指向的地址中的值才是真正的值 数组名本身就是指针,根据注释的上一行可以理解为,*p是指向数组名的指针(个人理解) 本帖最后由 风过无痕1989 于 2020-8-23 22:18 编辑
&i 就是取变量 i 的地址,然后将该地址交给了变量 o ,也即 o 贮存的是 i 的地址,*o 是指针变量,通过该指针变量存储的数据(地址),能够间接获得该地址上的数据 i,printf("o:%p\n",*o);
array 本是个二维数组,但若是你将 array 看作是该数组的名称的话,那它就成了一维数组。array 这个数组名就可以看成是一个地址的指针。------ “C语言标准规定,当数组名作为数组定义的标识符(也就是定义或声明数组时)、sizeof 或 & 的操作数时,它才表示整个数组本身,在其他的表达式中,数组名会被转换为指向第 0 个元素的指针(地址)。”
有了这个概念后,就不难理解 array = p 指向的是一个地址,也就是 array 这个单元的地址,*p = *array 就是取得 array 的值,这个值它就是一个地址。 首先,数组名里存放的是数组第一个数的地址,从某种角度看,数组名类似于指针(但他不是指针)
其次,int (*p)=array;这行语句创建了一个名字为“*p”的数组,所以*p存放的是该数组第一个元素的地址(划重点),而不是值。 加载中.. 发表于 2020-8-24 10:41
首先,数组名里存放的是数组第一个数的地址,从某种角度看,数组名类似于指针(但他不是指针)
其次,in ...
int (*p)是一个数组指针啊,他指向一个数组,他不是数组啊{:5_94:} duoqingang 发表于 2020-8-24 23:10
int (*p)是一个数组指针啊,他指向一个数组,他不是数组啊
对的,*p 是一个数组指针,指向的是 array 这个数组名的三列数组 定义时 p 和 o 的写法都不一样呢! duoqingang 发表于 2020-8-24 23:10
int (*p)是一个数组指针啊,他指向一个数组,他不是数组啊
不好意思,是我菜了,忘了还有这个概念,不好意思 本帖最后由 xiaozhangxuexi 于 2020-8-26 21:33 编辑
之前被这个问题困扰过一段时间。定义的p是指向有三个元素的数组的指针。指向数组的指针与指向数组元素的指针可不一样哈。指向数组元素的指针就是直接指向数组第一个元素,现在我们用的指向数组指针它就是直接指向一个数组的,不知道具体指向哪个元素。在这里p指向的是二维数组array中的第一行这个数组。之后进行*p取值操作后*p就是二位数组array中第一行的首个元素的地址了。 本帖最后由 duoqingang 于 2020-8-28 12:18 编辑
Cool_Breeze 发表于 2020-8-25 13:46
定义时 p 和 o 的写法都不一样呢!
注意到了,一个是定义指针变量,一个是定义数组指针 xiaozhangxuexi 发表于 2020-8-26 20:53
之前被这个问题困扰过一段时间。定义的p是指向有三个元素的数组的指针。指向数组的指针与指向数组元素的指 ...
有道理
页:
[1]