登录
立即注册
首页
>
绿虎论坛
>
杂类
>
学习
(
发帖
)
看着谭浩强的书,我郁闷了
我是五好学生
@Ta
2012-03-29
4595点击
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 /
样
/
源
沙发
2
老虎会游泳
@Ta
/ 2012-03-29 /
样
/
源
指针是内存地址,本质就是一个数字,它表示从0x00起内存的位置。
所以,如果a=0x00,p=a+5,那p就是0x05,表示内存的第5字节。
这是很方便的。
3
老虎会游泳
@Ta
/ 2012-03-29 /
样
/
源
比如
char *a="abcdefg";
我要显示第三个字以后的内容,就是defg
char *b=a+3;
printf("%s",b);
很方便吧
4
老虎会游泳
@Ta
/ 2012-03-29 /
样
/
源
想看指针到底指向内存的哪里,可以这样:
char *a="abcd";
char *b=a+3;
printf("a=%d\nb=%d\n",(int)a,(int)b);
也许,你得到的结果会令你惊讶的。如果你发现b<a,不要惊讶,因为大部分电脑都是倒着存储和读写数据的,在内存中,实际上是"dcba"
5
老虎会游泳
@Ta
/ 2012-03-29 /
样
/
源
指针不是数据,它只是数据的地址,它告诉了我们数据的类型和位置。
所以,指针+n得到一个指向当前数据之后的第n个数据,指针-n相反。
对于不同类型的指针,加减实际偏移的字节数是不同的。比如
int a[2];
int *b;
b=&a[0]+1;
此时,*b和a[1]是等效的。而&a[0]+1实际上把a[0]的地址加了4字节,这是一个int的长度。
6
春风沉醉的晚上
@Ta
/ 2012-03-29 /
样
/
源
嗯,指针和整形数相加还是指针,指针与指针相减就成整形数了。
7
春风沉醉的晚上
@Ta
/ 2012-03-29 /
样
/
源
老虎是集大成者,说的好广、好深,我们上学期学的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
8
春风沉醉的晚上
@Ta
/ 2012-03-29 /
样
/
源
呃,代码第六行 p2=p1 4;,加号打成空格了,应该是: p2=p1+4;
9
春风沉醉的晚上
@Ta
/ 2012-03-29 /
样
/
源
啊啊啊啊啊啊,又写错了,
printf("%d",*p2);//则输出结果为: 4
输出结果应该是:5。
10
老虎会游泳
@Ta
/ 2012-03-29 /
样
/
源
由7楼也可以推出5楼的结论。因为int是4字节的(我不知道VC++是不是,它可能是2字节,但手机的int都是4字节),那么
(int)p2 - (int)p1
的结果应该是16
如果int是2字节,结果就是8
11
春风沉醉的晚上
@Ta
/ 2012-03-29 /
样
/
源
谢谢老虎,说的真不错……
12
东城
@Ta
/ 2012-03-29 /
样
/
源
我看的是清华大学的!
13
老虎会游泳
@Ta
/ 2012-03-29 /
样
/
源
5楼的结论还有这样一个推论:
void *a,*b;
a=malloc(100);
b=a+10086;
此时b==a
如果指针是void型的,无论加减多少都不会变。
我在MPC上证实了这一点。
14
企鹅烧香
@Ta
/ 2012-03-29 /
样
/
源
指针可以和数字相加的。。。
15
无知的小宅男
@Ta
/ 2012-03-29 /
样
/
源
C语言!哈哈
添加新回复
回复需要
登录
。
所以,如果a=0x00,p=a+5,那p就是0x05,表示内存的第5字节。
这是很方便的。
char *a="abcdefg";
我要显示第三个字以后的内容,就是defg
char *b=a+3;
printf("%s",b);
很方便吧
char *a="abcd";
char *b=a+3;
printf("a=%d\nb=%d\n",(int)a,(int)b);
也许,你得到的结果会令你惊讶的。如果你发现b<a,不要惊讶,因为大部分电脑都是倒着存储和读写数据的,在内存中,实际上是"dcba"
所以,指针+n得到一个指向当前数据之后的第n个数据,指针-n相反。
对于不同类型的指针,加减实际偏移的字节数是不同的。比如
int a[2];
int *b;
b=&a[0]+1;
此时,*b和a[1]是等效的。而&a[0]+1实际上把a[0]的地址加了4字节,这是一个int的长度。
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
printf("%d",*p2);//则输出结果为: 4
输出结果应该是:5。
(int)p2 - (int)p1
的结果应该是16
如果int是2字节,结果就是8
void *a,*b;
a=malloc(100);
b=a+10086;
此时b==a
如果指针是void型的,无论加减多少都不会变。
我在MPC上证实了这一点。