THU_LSM 发表于 2020-4-30 16:23:13

数组指针的地址及其指向的地址

有如下数组指针:
int temp = {1 ,2, 3, 4, 5};
int (*p2) = &temp;
printf("p2 = %p\n",p2);
printf("p2+1 = %p\n",(p2+1));
printf("p2+2 = %p\n",(p2+2));
printf("*(p2) = %p\n",*(p2));
printf("*(p2+1) = %p\n",*(p2+1));
printf("*(p2+2) = %p\n",*(p2+2));

运行结果:
        p2 = 0x7ffee2628b80
        p2+1 = 0x7ffee2628b94
        p2+2 = 0x7ffee2628ba8
        *(p2) = 0x7ffee2628b80
        *(p2+1) = 0x7ffee2628b94
        *(p2+2) = 0x7ffee2628ba8

有一点疑问就是,指针p2本身的地址 和 指向的地址*p2是一样的呢?按理说不是应该不一样吗?
望大神能够帮忙答疑解惑!
编译器信息:
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

sunrise085 发表于 2020-4-30 16:38:05

你并没有输出 p2 的地址啊

可能是你对这种指针理解有误吧。
你定义的是数组指针,指针指向含有五个int类型数据的一维数组,指针+1调过的 是5个int类型数据的空间
这里 p2和*(p2)其实都是temp的地址,只是他们的意义不一样。
若取p2本身的地址,需要用 &p2

关于数组指针,你可以看看这个帖子。我之前回答的。

就是要努力呀 发表于 2020-4-30 16:48:14

p2是一个指向一维数组的数组指针
pringtf("%p\n", p2)表示以地址格式打印p2的值,打印的是p2指向的地址,而p2的值正是数组的首元素的地址,就是1
*p2的意思是对p2进行解引用
printf("%p", *p2)的意思是以地址格式打印*(p2)的值,打印的也是p2指向的地址,因为这是一个数组指针指向数组,对p2解引用一次得到的是第一排的首地址,也就是数组的的第一排的第一个元素,就是1
正确的打印p2本身的地址,要用到&取地址符
printf("%p\n", &p2)

THU_LSM 发表于 2020-4-30 17:17:20

就是要努力呀 发表于 2020-4-30 16:48
p2是一个指向一维数组的数组指针
pringtf("%p\n", p2)表示以地址格式打印p2的值,打印的是p2指向的地址, ...

我明白了。p2指向的内容偏巧就是地址,所以打印“p2指向的地址”和“p2指向的内容”就是一样的了。谢谢。

THU_LSM 发表于 2020-4-30 17:19:37

sunrise085 发表于 2020-4-30 16:38
你并没有输出 p2 的地址啊

可能是你对这种指针理解有误吧。


谢谢,我明白了。p2加一个会跳5个int,*p2是int temp的地址,所以*p2加一个就会跳1个int。
页: [1]
查看完整版本: 数组指针的地址及其指向的地址