1613551 发表于 2022-9-26 18:08:52

关于指针的问题

本帖最后由 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;
}

jackz007 发表于 2022-9-26 18:43:52

   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'

jhq999 发表于 2022-9-26 18:44:57

#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:10:42

本帖最后由 桃花飞舞 于 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'
很遗憾我也是看了结果才反应过来

1613551 发表于 2022-9-27 08:18:26

{:10_250:}可惜了,还有35鱼币浪费了

kerln888 发表于 2022-9-27 08:23:59

学习了{:10_256:}

kerln888 发表于 2022-9-27 08:25:19

{:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:}

hellogood 发表于 2022-9-27 09:29:31

领币

hellogood 发表于 2022-9-27 09:30:51

谢谢

hellogood 发表于 2022-9-27 09:37:33

{:5_108:}

1molHF 发表于 2022-9-28 06:38:47

学习了

1molHF 发表于 2022-9-28 07:03:53

{:10_256:}{:10_256:}{:10_256:}

1613551 发表于 2022-9-28 07:25:43

其实每个人最多可以领三次

hornwong 发表于 2022-9-28 10:34:24

{:5_108:}

zhangjinxuan 发表于 2022-9-28 19:43:27

指针令人头大,指针令人头疼

我在学C++,C++是用来打竞赛的

但,最近的竞赛似乎没有指针,所以我没仔细学指针{:10_256:}

zhangjinxuan 发表于 2022-9-28 19:43:57

这都不中?

1613551 发表于 2023-1-15 15:04:40

zhangjinxuan 发表于 2022-9-28 19:43
指针令人头大,指针令人头疼

我在学C++,C++是用来打竞赛的


所以拿到一等奖了吗{:10_254:}
页: [1]
查看完整版本: 关于指针的问题