关于指针的问题
本帖最后由 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 = {"one", "two"}, **p = a;
printf("%d\n", sizeof(a));
printf("%s\n", *(p++) + 1);
printf("%c\n", **p - 1);
return 0;
} char *a
这一句定义 a 为有两个元素的指针数组,你编译好的程序是 64 位的,每个指针占 8 个字节,两个指针占用 16 个字节,所以,sizeof(a) = 16
char ** p = a
那么,* p 就是 a,* p + 1 就是 a + 1,指向字符串 1 索引为 1 的字符 "ne"
p ++ 使 p 指向 a, ** p 指向 a,** p - 1 = a - 1 = 't' - 1 = 's' #include <stdio.h>
main(void)
{
char *a = {"one", "two"}, **p = a;
printf("%d\n", sizeof(a));//=8
printf("%s\n", a + 1);////和下面一样
printf("%s\n", p + 1);
printf("%c\n", **(p+1) - 1);////和下面一样
printf("%c\n", a - 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+1 所以就是a里面的指针由o移到n%s所以打印的就是ne, 后面一句的**p - 1上一句已经把p移动到a+1的位置了 这时候*p 相当于 a 也就是 "two"的首地址 **p - 1按%c格式输出 相当于 a 取以字节就是 't' - 1也就是 's'
很遗憾我也是看了结果才反应过来 {:10_250:}可惜了,还有35鱼币浪费了 学习了{:10_256:} {:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:} 领币 谢谢 {:5_108:} 学习了 {:10_256:}{:10_256:}{:10_256:} 其实每个人最多可以领三次
{:5_108:} 指针令人头大,指针令人头疼
我在学C++,C++是用来打竞赛的
但,最近的竞赛似乎没有指针,所以我没仔细学指针{:10_256:} 这都不中? zhangjinxuan 发表于 2022-9-28 19:43
指针令人头大,指针令人头疼
我在学C++,C++是用来打竞赛的
所以拿到一等奖了吗{:10_254:}
页:
[1]