|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 1613551 于 2022-9-26 18:11 编辑
我很疑惑,下面的sizeof(a)为什么是16,而不是8呢?不是占4个字节的两个字符串吗?
然后 **p=a,不是相当于把整个指针数组的地址都赋予给了p吗?那么p++,应该是超出了这个范围,跨度为8,取不到值了吧?
而**p-1,也是超出范围了吧?为什么好像还是可以取到值?
- #include <stdio.h>
- main(void)
- {
- char *a[2] = {"one", "two"}, **p = a;
- printf("%d\n", sizeof(a));
- printf("%s\n", *(p++) + 1);
- printf("%c\n", **p - 1);
- return 0;
- }
复制代码
本帖最后由 桃花飞舞 于 2022-9-26 22:14 编辑
16是因为你用的是64位的编译器,一个指针是8两个指针是16,你可以sizeof(指针) 的结果是8来验证是不是64位的编译器,32位的编译器一个指针是4两个是8,
至于后面的
- printf("%s\n", *(p++) + 1);
- printf("%c\n", **p - 1);
复制代码
我也算错了,这个题很有意思,是这样的,*(p++)+1 , p++是后置加所以先用后加这时候*(p++) +1 相当于a[0]+1 所以就是a[0]里面的指针由o移到n %s 所以打印的就是ne, 后面一句的**p - 1 上一句已经把p移动到a+1的位置了 这时候*p 相当于 a[1] 也就是 "two"的首地址 **p - 1按%c格式输出 相当于 a[1] 取以字节就是 't' - 1也就是 's'
很遗憾我也是看了结果才反应过来
|
|