鱼C论坛

 找回密码
 立即注册
查看: 3220|回复: 16

[已解决]关于指针的问题

[复制链接]
发表于 2022-9-26 18:08:52 | 显示全部楼层 |阅读模式

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

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

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: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[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'
很遗憾我也是看了结果才反应过来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-26 18:43:52 | 显示全部楼层

回帖奖励 +5 鱼币

   
char *a[2]
     这一句定义 a 为有两个元素的指针数组,你编译好的程序是 64 位的,每个指针占 8 个字节,两个指针占用 16 个字节,所以,sizeof(a) = 16

     char ** p = a
     那么,* p 就是 a[0],* p + 1 就是 a[0] + 1,指向字符串 1 索引为 1 的字符 "ne"
     p ++ 使 p 指向 a[1], ** p 指向 a[1][0],** p - 1 = a[1][0] - 1 = 't' - 1 = 's'  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-26 18:44:57 | 显示全部楼层
#include <stdio.h>
main(void)
{
  char *a[2] = {"one", "two"}, **p = a;
  printf("%d\n", sizeof(a));//=8
  printf("%s\n", a[0] + 1);////和下面一样
  printf("%s\n", p[0] + 1);
  printf("%c\n", **(p+1) - 1);////和下面一样
  printf("%c\n", a[1][0] - 1);
  return 0;
}

无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[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'
很遗憾我也是看了结果才反应过来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-27 08:18:26 | 显示全部楼层
可惜了,还有35鱼币浪费了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 08:23:59 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 08:25:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-27 09:29:31 | 显示全部楼层

回帖奖励 +5 鱼币

领币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-27 09:30:51 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-27 09:37:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-28 06:38:47 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-28 07:03:53 | 显示全部楼层

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-28 07:25:43 | 显示全部楼层
其实每个人最多可以领三次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-28 10:34:24 | 显示全部楼层

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-28 19:43:27 | 显示全部楼层
指针令人头大,指针令人头疼

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

但,最近的竞赛似乎没有指针,所以我没仔细学指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-28 19:43:57 | 显示全部楼层

回帖奖励 +5 鱼币

这都不中?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-15 15:04:40 | 显示全部楼层
zhangjinxuan 发表于 2022-9-28 19:43
指针令人头大,指针令人头疼

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

所以拿到一等奖了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 22:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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