LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: seablue

有关指针的错误,帮我看看

[复制链接]
发表于 2004-5-22 17:46:58 | 显示全部楼层
打印出指针在内存的地址:
char *p;
char a;
p = &a;
printf("%u\n", p);

其他的找本基础书看看。。。
 楼主| 发表于 2004-5-22 18:02:50 | 显示全部楼层
:thank all of you
明白了,验证通过:


  1. [linuxer@mydesktop bmp]$ cat test.c
  2. #include <stdio.h>
  3. main()
  4. {
  5. short int *ptr;
  6. int *lptr;
  7. printf("ptr=%lx, ptr-1=%lx\n",ptr,ptr-1);
  8. printf("lptr=%lx, lptr-1=%lx\n",lptr,lptr-1);
  9. }
  10. 结果:
  11. [linuxer@mydesktop bmp]$ ./test.o
  12. ptr=40015920, ptr-1=4001591e
  13. lptr=42131a14, lptr-1=42131a10
复制代码
 楼主| 发表于 2004-5-22 18:18:57 | 显示全部楼层
进一步的改进:

  1. #include <stdio.h>
  2. main()
  3. {
  4. short int *ptr;
  5. int *lptr;
  6. int a,b,c,d;
  7. a=(int)ptr;
  8. b=(int)(ptr-1);
  9. c=(int)lptr;
  10. d=(int)(lptr-1);
  11. printf("ptr=%lx, ptr-1=%lx\n",ptr,ptr-1);
  12. printf("lptr=%lx, lptr-1=%lx\n",lptr,lptr-1);
  13. printf("ptr-1实际减少的值:%ld\n",a-b);
  14. printf("lptr-1实际减少的值:%ld\n",c-d);
  15. }

  16. 结果:
  17. [linuxer@mydesktop bmp]$ gcc -o test.o test.c
  18. [linuxer@mydesktop bmp]$ ./test.o
  19. ptr=40015920, ptr-1=4001591e
  20. lptr=42131a14, lptr-1=42131a10
  21. ptr-1实际减少的值:2
  22. lptr-1实际减少的值:4
复制代码
发表于 2004-5-22 19:08:29 | 显示全部楼层
好像是pointer本身的size和integer变量的size就有差别, 所以才会这样的。
 楼主| 发表于 2004-5-22 22:35:21 | 显示全部楼层
是我把指针和指针变量搞混了,所以讲了很多大家也没明白我想干吗

指针的数据类型决定了-1的实际数值;
指针的数据类型就是指针指向的数据的类型,指针实际上就是这个数据的地址;
指针变量则是保存指针(地址)的那个变量;它的数据类型则是整型的。

再完善的改造一下演示程序,如下:

  1. [linuxer@mydesktop bmp]$ cat test.c
  2. /*
  3. * 演示指针赋值,和运算的程序。
  4. * %p和%x输出格式化只是%p带前导0。
  5. *               Version 0.4.0
  6. *    Copyright (C) seablue at linuxsir.cn
  7. *                 2004-05-23
  8. */
  9. #include <stdio.h>
  10. main()
  11. {
  12. short *ptr;
  13. int *lptr;
  14. int a,b,c,d;
  15. ptr=(short *)0x0002;
  16. lptr=(int *)0x00000004;
  17. a=(int)ptr;
  18. b=(int)(ptr-1);
  19. c=(int)lptr;
  20. d=(int)(lptr-1);
  21. printf("ptr=%lx, ptr-1=%lx\n",ptr,ptr-1);
  22. printf("lptr=%lx, lptr-1=%lx\n",lptr,lptr-1);
  23. printf("ptr-1(指针变量减1)实际减少的字节数:%ld\n",a-b);
  24. printf("lptr-1(指针变量减1)实际减少的字节数:%ld\n",c-d);
  25. }

  26. 结果是:
  27. [linuxer@mydesktop bmp]$ gcc -o test.o test.c
  28. [linuxer@mydesktop bmp]$ ./test.o
  29. ptr=2, ptr-1=0
  30. lptr=4, lptr-1=0
  31. ptr-1(指针变量减1)实际减少的字节数:2
  32. lptr-1(指针变量减1)实际减少的字节数:4
复制代码
发表于 2004-5-23 08:12:50 | 显示全部楼层
pointer和你自身的定义有关(int,short,long),以及你的电脑的配置有关系!
 楼主| 发表于 2004-5-23 15:46:20 | 显示全部楼层
:thank
1、不能理解“电脑的配置有关系”,能否举个例子?:p
2、修改了一下最后版本的那个演示,使表达跟清晰。
 楼主| 发表于 2004-5-29 23:28:25 | 显示全部楼层
现在看来我的演示程序是有局限的。比如在结构里头成员*ptr可能不能被赋值。
还没有完全了解,将来在进一步修改:sorry
发表于 2004-5-30 08:35:38 | 显示全部楼层
最初由 wuhu 发表
pointer和你自身的定义有关(int,short,long),以及你的电脑的配置有关系!

说得不准确吧,和电脑配置没关系,应该是和体系结构有关系。
发表于 2004-5-30 09:20:42 | 显示全部楼层
我几记得好象int的长度如下:
int:和CPU有关,可能是16位,也可能是32位
long:32位
short:16位

呵呵!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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