鱼C论坛

 找回密码
 立即注册
查看: 1085|回复: 3

[已解决]指针数组地址疑问

[复制链接]
发表于 2020-8-27 18:01:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 komodo 于 2020-8-27 18:01 编辑

【疑问】
为什么p和&p的结果相等?
【我的想法】
p指向指针p1自身的地址,那p的值就是p1所在的地址,同时p自己就是个指针,也会占用内存,也会拥有自己的地址,所以&p应该打印指针p自身所在的地址,但是结果p和&p打印的结果一致,按理说&p和p的值是两个不同的地址啊,望赐教。

  1. int a = 10;
  2. int b = 2;
  3. int c = 22;
  4. int *p1 = &a;   
  5. int *p2 = &b;   
  6. int *p3 = &c;   
  7. int *p[] = {p1, p2, p3};

  8. printf("p  = %p\n", p);
  9. printf("&p = %p\n", &p);

  10. //结果如下
  11. //p  = 0x7ffee0767700
  12. //&p = 0x7ffee0767700
复制代码
最佳答案
2020-8-27 19:03:16
因为你这个*p[]是一个指针数组
对于数组来说,数组名就是取数组的地址,使用&符号也是取地址,因此这两个结果是一样的
这个想不明白的话,可以写一个一般的数组,看看,或许就明白了。
因为指针数组也是数组
  1. #include <stdio.h>
  2. int main(void) {
  3.     int p[] = {1,2,3};
  4.     printf("p  = %p\n", p);//这个是取数组地址
  5.     printf("&p = %p\n", &p);//这个也是取数组地址
  6.         return 0;
  7. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-28 13:09:39 | 显示全部楼层
本帖最后由 komodo 于 2020-8-28 13:12 编辑

后来的同学可以看如下代码,如果你也搞清楚了的话,看到如下代码也会豁然开朗的
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main(void){
  4.     char *p[] = {
  5.         "dalian",
  6.         "shenzhen",
  7.         "guangxi"
  8.     };
  9.     printf("p     = %p\n", p);
  10.     printf("&p    = %p\n", &p);
  11.     printf("&p[0] = %p\n", &p[0]);
  12.     printf("\n");
  13.     printf("*p       = %p\n", *p);
  14.     printf("p[0]     = %p\n", p[0]);
  15.     printf("&p[0][0] = %p\n", &p[0][0]);
  16.     printf("\n");
  17.     printf("*p       = %s\n", *p);
  18.     printf("p[0]     = %s\n", p[0]);
  19.     printf("\n");
  20.     printf("**p     = %c\n", **p);
  21.     printf("*p[0]   = %c\n", *p[0]);
  22.     printf("p[0][0] = %c\n", p[0][0]);


  23.     return 0;
  24. }
  25. /*
  26. p     = 0x7ffee9ea96b0
  27. &p    = 0x7ffee9ea96b0
  28. &p[0] = 0x7ffee9ea96b0

  29. *p       = 0x105d56ef8
  30. p[0]     = 0x105d56ef8
  31. &p[0][0] = 0x105d56ef8

  32. *p       = dalian
  33. p[0]     = dalian

  34. **p     = d
  35. *p[0]   = d
  36. p[0][0] = d
  37. */
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-27 19:03:16 | 显示全部楼层    本楼为最佳答案   
因为你这个*p[]是一个指针数组
对于数组来说,数组名就是取数组的地址,使用&符号也是取地址,因此这两个结果是一样的
这个想不明白的话,可以写一个一般的数组,看看,或许就明白了。
因为指针数组也是数组
  1. #include <stdio.h>
  2. int main(void) {
  3.     int p[] = {1,2,3};
  4.     printf("p  = %p\n", p);//这个是取数组地址
  5.     printf("&p = %p\n", &p);//这个也是取数组地址
  6.         return 0;
  7. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-28 13:07:49 | 显示全部楼层
sunrise085 发表于 2020-8-27 19:03
因为你这个*p[]是一个指针数组
对于数组来说,数组名就是取数组的地址,使用&符号也是取地址,因此这两个 ...

非常感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 16:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表