开发平台(Platform): (Ex: Win10, Linux, ...)
online c compiler
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
NA
问题(Question):
想请教为什么 a 与 *a 的 %p address 会是一样的呢?
我的理解是 int (*a)[6] 是指向一个长度为 6 的 int 型态的指标,所以 a 应该会存放
&str 位置
printf a 会出现 &str 这部分可以理解。
但 printf *a 应该是对 a 取值再用%p显示,所以会得到 0x68 也就是 'h'。
还请各位大神指导,感谢!
虽然这种方式好像很少使用XD
喂入的资料(Input):
NA
预期的正确结果(Expected Output):
run:
a address: 0x7ffdd628c6d2
*a address: 0x7ffdd628c6d2
expect:
a: 0x7ffdd628c6d2
*a: 0x68
错误结果(Wrong Output):
NA
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
char str[6] = "hello";
char (*a)[6] = &str;
printf("a address: %p\n", a);
printf("*a address: %p\n", *a);
补充说明(Supplement):
int (*a)[6] 这样的宣告写10几年C还没见过.
作者:
wei115 (ㄎㄎ)
2023-05-29 02:41:00你说a = &str 那*a = str嘛 &str=strstr[0] = *(str+0), 所以你不会显示str[0]的值阵列是阵列 指标是指标 别被C的a[n] = *(a+n)骗惹
作者:
LPH66 (-6.2598534e+18f)
2023-05-29 07:26:00第一个 %p 印的是身为 char(*)[6] 的指标第二个 %p 印出的是 char[6] decay 成的 char* 指标你要的 'h' 是 **a
作者:
wei115 (ㄎㄎ)
2023-05-29 13:01:00阿就str==&str阿 你把阵列当成一种指标惹 认为对阵列取址会有一个和阵列名不同的值
str跟&str虽然值一样 型态却不同 行为也不同
作者:
wei115 (ㄎㄎ)
2023-05-29 13:39:00对,一个是[],一个是(*)[]
作者:
descent (“雄辩是银,沉默是金”)
2023-05-29 19:19:00printf("*a[0] address: %c\n", *a[0]);printf("*a[0] address: %x\n", *a[0]);你要的效果应该是这样, 很有趣的问题, 想好久
作者:
wei115 (ㄎㄎ)
2023-05-29 19:29:00a的type是(*)[],*a才是[] 引用就加一个* 解引用就减一个*
作者:
LPH66 (-6.2598534e+18f)
2023-05-29 20:39:00首先你做了 a = &str, 所以理论上 *a "==" str而 str 是个 char[6] 所以 *a 也是个 char[6]而一个阵列型态在大多数状况里会 decay 成指向首元素的指标所以印 *a 印出的指标是这个东西
作者:
LPH66 (-6.2598534e+18f)
2023-05-31 01:46:00[] 里面没东西的型别宣告是未知长度, 除非有初始化指定长度char a[]="hello"; 右边是 6 个元素, 所以这等于 char a[6]至于 char(*a)[], 你是宣告一个指向未知长度阵列的指标这跟字串实字是个指向字符指标是不一样的
可以阅读"Expert C Programming: Deep C Secrets"这本书有几章在阐述array跟pointer的特质,值得一看
作者:
wei115 (ㄎㄎ)
2023-05-31 11:24:00楼上好书,轻松有趣又实用
char *a = str; // 你要的效果应该是这样