已掉线,重新登录

首页 > 绿虎论坛 > 杂类 > 学习 (发帖)

标题: 看着谭浩强的书,我郁闷了

作者: @Ta

时间: 2012-03-29

点击: 4591

int v(int *a,int n)
{int *p;
a=p+n;}
注:main{int a[10],x;省略赋值了,省略剩下的 x=v(a,10);}
a=p+n合法吗?指针=指针+数字,指针不是地址吗?怎么能和数据相加?

[隐藏样式|查看源码]


『回复列表(15|隐藏机器人聊天)』

1. 沙发
(/@Ta/2012-03-29 08:54//)

2. 指针是内存地址,本质就是一个数字,它表示从0x00起内存的位置。
所以,如果a=0x00,p=a+5,那p就是0x05,表示内存的第5字节。
这是很方便的。
(/@Ta/2012-03-29 09:12//)

3. 比如
char *a="abcdefg";
我要显示第三个字以后的内容,就是defg
char *b=a+3;
printf("%s",b);
很方便吧
(/@Ta/2012-03-29 09:14//)

4. 想看指针到底指向内存的哪里,可以这样:
char *a="abcd";
char *b=a+3;
printf("a=%d\nb=%d\n",(int)a,(int)b);
也许,你得到的结果会令你惊讶的。如果你发现b<a,不要惊讶,因为大部分电脑都是倒着存储和读写数据的,在内存中,实际上是"dcba"
(/@Ta/2012-03-29 09:21//)

5. 指针不是数据,它只是数据的地址,它告诉了我们数据的类型和位置。
所以,指针+n得到一个指向当前数据之后的第n个数据,指针-n相反。
对于不同类型的指针,加减实际偏移的字节数是不同的。比如
int a[2];
int *b;
b=&a[0]+1;
此时,*b和a[1]是等效的。而&a[0]+1实际上把a[0]的地址加了4字节,这是一个int的长度。
(/@Ta/2012-03-29 09:53//)

6. 嗯,指针和整形数相加还是指针,指针与指针相减就成整形数了。
(/@Ta/2012-03-29 10:02//)

7. 老虎是集大成者,说的好广、好深,我们上学期学的C。指针加整数n,表示指向后移n位。比如题中数组a,假设这样定义:
a[10]={1,2,3,4,5,6,7,8,9,0};
int *p1=a,*p2;
int num;
p2=p1 4;//则此时,指针p2指向a[4]
 printf("%d",*p2);//则输出结果为: 4
num=p2-p1;
 printf("%d",num);//此时输出为:4
(/@Ta/2012-03-29 10:21//)

8. 呃,代码第六行 p2=p1 4;,加号打成空格了,应该是: p2=p1+4;
(/@Ta/2012-03-29 10:25//)

9. 啊啊啊啊啊啊,又写错了,
 printf("%d",*p2);//则输出结果为: 4
输出结果应该是:5。
(/@Ta/2012-03-29 10:30//)

10. 由7楼也可以推出5楼的结论。因为int是4字节的(我不知道VC++是不是,它可能是2字节,但手机的int都是4字节),那么
(int)p2 - (int)p1
的结果应该是16
如果int是2字节,结果就是8
(/@Ta/2012-03-29 11:03//)

11. 谢谢老虎,说的真不错……
(/@Ta/2012-03-29 11:29//)

12. 我看的是清华大学的!
(/@Ta/2012-03-29 11:44//)

13. 5楼的结论还有这样一个推论:
void *a,*b;
a=malloc(100);
b=a+10086;
此时b==a
如果指针是void型的,无论加减多少都不会变。
我在MPC上证实了这一点。
(/@Ta/2012-03-29 12:03//)

14. 指针可以和数字相加的。。。
(/@Ta/2012-03-29 13:37//)

15. C语言!哈哈
(/@Ta/2012-03-29 17:38//)

回复需要登录

8月26日 18:06 星期二

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1