鱼C论坛

 找回密码
 立即注册
查看: 1165|回复: 6

[已解决]s1e21指针概念小问题

[复制链接]
发表于 2021-4-8 12:03:15 | 显示全部楼层 |阅读模式

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

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

x
请大家看看,我这个程序,比小甲鱼多加了几行。printf("the addr of a is:%p\n",a);这是打印变量a的地址是吧,那因为a是char类型,出的结果是16进制“43”很好理解,可是,变量f是整形,应该占用四个字节,出来的结果不应该是16进制的一个八位的数吗如“20654821”,怎么出来的是“7C”;
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char a='F';
  5.         int f=123;
  6.        
  7.         char *pa=&a;//这里什么类型变量,看储存的变量地址是什么类型
  8.         int *pf=&f; //不管前面写的什么类型,指针变量占用的都是四个字节,本系统占用八个字节
  9.        
  10.         printf("a=%c\n",*pa);
  11.         printf("f=%d\n",*pf);
  12.        
  13.         *pa='C';
  14.         *pf+=1;
  15.        
  16.         printf("now,a=%c\n",*pa);
  17.         printf("now,f=%d\n",*pf);
  18.         putchar('\n');
  19.        
  20.         printf("size of a=%d\n",sizeof(a));
  21.         printf("size of f=%d\n",sizeof(f));
  22.         printf("size of pa=%d\n",sizeof(pa));
  23.         printf("size of pf=%d\n",sizeof(pf));
  24.         putchar('\n');
  25.        
  26.         printf("the addr of a is:%p\n",a);
  27.         printf("the addr of f is:%p\n",f);
  28.         printf("%c\n",a);
  29.         printf("%d\n",f);
  30.         putchar('\n');
  31.        
  32.         printf("the addr of a is:%p\n",pa);
  33.         printf("the addr of f is:%p\n",pf);
  34.         printf("%d\n",pa);
  35.         printf("%d\n",pf);
  36.         return 0;
  37. }
复制代码
最佳答案
2021-4-8 15:25:40
本帖最后由 肖-肖 于 2021-4-8 15:27 编辑

首先:printf("the addr of a is:%p\n",a);这不是打印变量a的地址!
解释如下:
%p意思就是以16进制的格式输出,一般为了输出地址了。而不是你用%p输出就是输出那个变量的地址!
地址一般都是以&开头的
如果想要打印变量a的地址应该是:printf("the addr of a is:%p\n",&a);才对!

我修改了代码,应该比较容易看懂了:代码如下:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char a='F';
  5.         int f=123;

  6.         char *pa=&a;//这里什么类型变量,看储存的变量地址是什么类型
  7.         int *pf=&f; //不管前面写的什么类型,指针变量占用的都是四个字节,本系统占用八个字节

  8.         printf("old a=%c\n",*pa);
  9.         printf("old f=%d\n",*pf);

  10.         *pa='C';
  11.         *pf+=1;//这里f和*pf的值就都变成了124

  12.         printf("now,a=%c\n",*pa);//'f'
  13.         printf("now,f=%d\n",*pf);//124
  14.         putchar('\n');

  15.         printf("size of a=%d\n",sizeof(a));
  16.         printf("size of f=%d\n",sizeof(f));
  17.         printf("size of pa=%d\n",sizeof(pa));
  18.         printf("size of pf=%d\n",sizeof(pf));
  19.         putchar('\n');

  20.         printf("the addr of a is:%p\n",&a);
  21.         printf("the addr of f is:%p\n",&f);
  22.         printf("%c\n",a);
  23.         printf("%d\n",f);
  24.         putchar('\n');

  25.         printf("the addr of pa is:%p\n",pa);
  26.         printf("the addr of pf is:%p\n",pf);
  27.         printf("pa=%d\n",pa);
  28.         printf("pa=%p\n",pa);//printf("the addr of a is:%p\n",&a);是和这里输出的是一样的!-->所以pa就是a的地址!
  29.         printf("pf=%d\n",pf);
  30.         printf("pf=%p\n",pf);
  31.         return 0;
  32. }
复制代码

运行结果如下:
  1. old a=F
  2. old f=123
  3. now,a=C
  4. now,f=124

  5. size of a=1
  6. size of f=4
  7. size of pa=4
  8. size of pf=4

  9. the addr of a is:0060FEF7
  10. the addr of f is:0060FEF0
  11. C
  12. 124

  13. the addr of pa is:0060FEF7
  14. the addr of pf is:0060FEF0
  15. pa=6356727
  16. pa=0060FEF7
  17. pf=6356720
  18. pf=0060FEF0

  19. Process returned 0 (0x0)   execution time : 1.142 s
  20. Press any key to continue.
复制代码

希望有点用吧!
练习1.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-8 12:12:06 | 显示全部楼层
另外,我想打印出指针变量pa,pf的地址,所以用        printf("the addr of a is:%p\n",pa);printf("the addr of f is:%p\n",pf);不知道这样对不对?看出的结果,“62FE0F”和“62FE0”,然后我又想着,直接把指针变量中储存的值打印出来,那指针变量中储存的值不就是变量a和f的地址吗,那讲道理出来的结果应该能和前面的相对应,可是出来的结果怎么是“6487567”和“6487560”,那这和前面直接打印a和f的地址“43”和“7C”也对不上啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-8 12:34:06 | 显示全部楼层
printf("the addr of f is:%p\n",f);   这个你传递的不是 f 的值吗,又不是 f 的地址。f 的十进制值是 124 ,%p 输出当然就是 7C 了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-8 15:09:07 | 显示全部楼层
百里狂生 发表于 2021-4-8 12:34
printf("the addr of f is:%p\n",f);   这个你传递的不是 f 的值吗,又不是 f 的地址。f 的十进制值是 124  ...

%p不是输出地址的意思吗,那我想输出  f 的地址怎么打,另外输出 f 的值不应该是%d吗?且   printf("the addr of a is:%p\n",a);   那出的“43”什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-8 15:25:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 肖-肖 于 2021-4-8 15:27 编辑

首先:printf("the addr of a is:%p\n",a);这不是打印变量a的地址!
解释如下:
%p意思就是以16进制的格式输出,一般为了输出地址了。而不是你用%p输出就是输出那个变量的地址!
地址一般都是以&开头的
如果想要打印变量a的地址应该是:printf("the addr of a is:%p\n",&a);才对!

我修改了代码,应该比较容易看懂了:代码如下:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char a='F';
  5.         int f=123;

  6.         char *pa=&a;//这里什么类型变量,看储存的变量地址是什么类型
  7.         int *pf=&f; //不管前面写的什么类型,指针变量占用的都是四个字节,本系统占用八个字节

  8.         printf("old a=%c\n",*pa);
  9.         printf("old f=%d\n",*pf);

  10.         *pa='C';
  11.         *pf+=1;//这里f和*pf的值就都变成了124

  12.         printf("now,a=%c\n",*pa);//'f'
  13.         printf("now,f=%d\n",*pf);//124
  14.         putchar('\n');

  15.         printf("size of a=%d\n",sizeof(a));
  16.         printf("size of f=%d\n",sizeof(f));
  17.         printf("size of pa=%d\n",sizeof(pa));
  18.         printf("size of pf=%d\n",sizeof(pf));
  19.         putchar('\n');

  20.         printf("the addr of a is:%p\n",&a);
  21.         printf("the addr of f is:%p\n",&f);
  22.         printf("%c\n",a);
  23.         printf("%d\n",f);
  24.         putchar('\n');

  25.         printf("the addr of pa is:%p\n",pa);
  26.         printf("the addr of pf is:%p\n",pf);
  27.         printf("pa=%d\n",pa);
  28.         printf("pa=%p\n",pa);//printf("the addr of a is:%p\n",&a);是和这里输出的是一样的!-->所以pa就是a的地址!
  29.         printf("pf=%d\n",pf);
  30.         printf("pf=%p\n",pf);
  31.         return 0;
  32. }
复制代码

运行结果如下:
  1. old a=F
  2. old f=123
  3. now,a=C
  4. now,f=124

  5. size of a=1
  6. size of f=4
  7. size of pa=4
  8. size of pf=4

  9. the addr of a is:0060FEF7
  10. the addr of f is:0060FEF0
  11. C
  12. 124

  13. the addr of pa is:0060FEF7
  14. the addr of pf is:0060FEF0
  15. pa=6356727
  16. pa=0060FEF7
  17. pf=6356720
  18. pf=0060FEF0

  19. Process returned 0 (0x0)   execution time : 1.142 s
  20. Press any key to continue.
复制代码

希望有点用吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-8 15:55:35 | 显示全部楼层
肖-肖 发表于 2021-4-8 15:25
首先:printf("the addr of a is:%p\n",a);这不是打印变量a的地址!
解释如下:
%p意思就是以16进制的格式 ...

感谢,懂了,不过我还想多问一句,char a;和int f;它们占的字节数不一样,怎么输出这两个地址时,一个是“0060FEF7”  ,一个是“0060FEF0”;    那意思是“0060FEF7”这个位置放了‘F’;而“0060FEF0”~“0060FEF3”这四个位置放了‘123’吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-8 16:14:26 | 显示全部楼层
kkk纯粹 发表于 2021-4-8 15:55
感谢,懂了,不过我还想多问一句,char a;和int f;它们占的字节数不一样,怎么输出这两个地址时,一个 ...

这个至于为什么会这么输出,我也不太懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 11:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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