鱼C论坛

 找回密码
 立即注册
查看: 4369|回复: 11

关于指针 疑惑 其中是否有规律

[复制链接]
发表于 2013-3-20 14:47:26 | 显示全部楼层 |阅读模式
30鱼币
QQ截图20130320144237.png
#include <stdio.h>
#include <stdlib.h>
void bj(int *);
int main(void)
{ int i=1;
bj(&i);
system("PAUSE");
return 0;
}
void bj(int *p)
{
printf("地址p=%p \n",p);
printf("右值*p=%p \n",*p);
printf("*(p++)=%p  \n",*(p++));
printf("地址p=%p \n",p);
printf("右值*p=%p \n",*p);
printf("++*p=%p\n",++*p);
printf("地址p=%p \n",p);
printf("右值*p=%p \n",*p);
}
0X78-0X48=0X30=>48  48 =32+16.
第二次的右值 是垃圾值 还是有什么规律?
32位系统.

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-20 14:47:27 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void bj(int *);

  4. int main(void)
  5. {
  6.         int i=1;
  7.         bj(&i);
  8.         system("PAUSE");
  9.         return 0;
  10. }

  11. void bj(int *p)
  12. {
  13.         //正常,p是地址,*p是i的值
  14.         printf("地址p=%p \n",p);
  15.         printf("右值*p=%d \n",*p);
  16.         //正常 ++*p是i的值++
  17.         printf("++*p=%d \n",++*p);

  18.         //p++;
  19.         //printf("*(p++)=%d  \n",*p);
  20.         printf("*(p++)=%d  \n",*(p++));  //看输出应该还是先执行了语句才进行 ++ 的,不过都已经加了括号,按理说...费解
  21.         //上一句执行完指针已经指向了未定义内存。
  22.         printf("地址p=%p \n",p);     
  23.         printf("右值*p=%d \n",*p);  //错误p已经指向未知内存  
  24.         //printf("++*p=%d \n",++*p);   //错误p已经指向未知内存 操作未知内存程序会报错
  25.         printf("地址p=%p \n",p);
  26.         printf("右值*p=%d \n",*p);     //错误p已经指向未知内存
  27. }
复制代码
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-20 17:49:13 | 显示全部楼层
本帖最后由 小新110 于 2013-3-20 17:51 编辑

对于i对应的内存,只有i地址是有效的,后面的p++地址都移动到未分配内存了,研究它的值有什么意义呢?本来p指向i的时候,++*p还是有值的,就是2,但是你将p的指向变掉了,所以这句也没有什么意义了。
另:%p是打印指针,%d是打印整数,所以*p还是要用%d.

%p 显示一个指针,near指针表示为:XXXX
  far 指针表示为:XXXX:YYYY

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-20 19:05:00 | 显示全部楼层

我用 %p ,以16进制打印整型或指针. double型 不可以.  *(p++),是先取 *p的右值,然后偏移一个int型.当然第三次,是在指针偏移后的右值+1.在第二次中,指针偏移后的地址内存中的值,是未分配的值,通常都认为是垃圾值.但是,对于,它的地址编号和 其中的值 ,之差是 32+16. 这之间有什么关系?我感觉有些规律,也可能是我庸人自扰,因为我还没看涉及这方面的书.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-20 19:24:57 | 显示全部楼层

48=32+16 . 32*8=256 = 1 0000 0000  , 16*8=1000 0000  , 如果是16位来说,第一个是进位,值为0,第二个补码是0.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-20 19:47:46 | 显示全部楼层
本帖最后由 坦_然 于 2013-3-20 19:51 编辑

     这并不是所谓的 垃圾值啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-20 19:48:24 | 显示全部楼层
小新110 发表于 2013-3-20 17:49
对于i对应的内存,只有i地址是有效的,后面的p++地址都移动到未分配内存了,研究它的值有什么意义呢?本来p ...

是为了兼容 x8086吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-20 20:09:44 | 显示全部楼层
小新110 发表于 2013-3-20 17:49
对于i对应的内存,只有i地址是有效的,后面的p++地址都移动到未分配内存了,研究它的值有什么意义呢?本来p ...

我用%p 打印补码 ,例如, int i=-1; printf(" %p \n ",i); =>  FFFFFFFF,    从而知道,内存中的存储.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-20 23:44:14 | 显示全部楼层
同求答案啊 等待大神的到来你
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-21 00:38:53 | 显示全部楼层
看似好难得样子
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-24 00:37:25 | 显示全部楼层
貌似很复杂的样子啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-25 23:01:37 | 显示全部楼层
是随机的,因为你的指针P一开始是指向了一个整形数,而不是数组,所以移动指针后,求得的值无意义
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-5 10:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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