2 smilence l Smilence_L 于 2015.06.16 23:06 提问

小白问个关于C指针的问题

point(char *p)
{
p+=3;
}
main()
{ char b[4]={'m','n','o','p'},*pt=b;
point(pt);
printf("%c\n",*pt);
}

本以为答案是p,但是为什么是m?
答案解释是因为这次调用函数是值传递而不是址传递,为何?(*p)+3倒是可以输出p,但是为什么呢?不用函数调用,使用p+3也可以输出p。函数调用到底发生了什么,用指针好迷糊。

9个回答

Evankaka
Evankaka   Ds   Rxr 2015.06.16 23:21

应该这样理解,把指针传递,传递的是指针的地址,p是地址,可以认为是形参,它是你传入的那个指针地址的一个副本,所以改变*p时,指针指向的内容也会改变。
但是如果 改变指针的地址,比如这里的p+,改变以形参,实参是不会发生改变的

Smilence_L
Smilence_L 谢谢你的回答,好详细
2 年多之前 回复
Evankaka
Evankaka 然后再想想按指针传递中一级指针传递和二级指针传递的意思。
2 年多之前 回复
Evankaka
Evankaka 回复Smilence_L: 是的,p只是pt的一个副本,它们两人个都是地址。并且相同。想想指针的性质。如果这里你想实现形参地址改变时,实参也跟着变,那么就要用二级指针,**p当作参数。建议好好理顺按指针传递的真实意义!
2 年多之前 回复
Evankaka
Evankaka 回复Smilence_L: 是的,你要理解好按指针传递其实就是按值传递,只不过传递的是指针的地址。函数里用的指针地址就是原指针地址的一个副本。p++形参改变,实参不会发生改变。但是形参和实参都是指向同一块地方。所以*p改变时,*pt也跟着改
2 年多之前 回复
Smilence_L
Smilence_L 仅仅使用p++改变指向不会改变pt的指向么??而使用取值*p才能改变pt的值?
2 年多之前 回复
ycg514230
ycg514230   Rxr 2015.06.17 10:19

如果你想改变pt的值变成'p',你应该把这样:
point(char **p)
{
p+=3;
}
main()
{ char b[4]={'m','n','o','p'};
char *pt=b;
point(&pt);
printf("%c\n",*pt);
}
这样就能改变指针的值。

Smilence_L
Smilence_L 谢谢啊,关于二级指针我再去好好看看书
2 年多之前 回复
Smilence_L
Smilence_L 为何二级指针可以?
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.06.16 23:14

你需要得到m,有两个写法
(1)

point(char &*p)

(2)
*p='m';

Smilence_L
Smilence_L 谢谢
2 年多之前 回复
a1193561652
a1193561652   Rxr 2015.06.16 23:15

在point()里只可以改变*p,不可以改变p,所以那个p+=3相当于没用。

Smilence_L
Smilence_L 谢谢
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.06.16 23:15

(1)你传指针的引用,会改变实参的指针
(2)你修改指针,不会影响实参的指针。但是修改指针指向的内容会影响原来的数组。

Smilence_L
Smilence_L 谢谢
2 年多之前 回复
u010739973
u010739973   2015.06.16 23:35

point()函数调用时将pt的形参传递过去,不会影响实参的值,也就是说无论point()函数内部怎么改变,变量的作用范围是函数的内部。

Smilence_L
Smilence_L 谢谢
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.06.16 23:45

point函数只能修改p指向的内容,对于指针本身修改的是拷贝,所以无效,你需要传char**二级指针

Smilence_L
Smilence_L 就是说如果传是二级指针q,那么q++就相当于pt++了么?
2 年多之前 回复
tongyi55555
tongyi55555   2015.06.17 08:05

当年学指针那叫一个痛苦啊。指针修改不会改变实参。

Smilence_L
Smilence_L 我正在步你的后尘,真的太痛苦了
2 年多之前 回复
star890124
star890124   2015.06.17 10:59

在main里边这么调用: point(*pt)

Smilence_L
Smilence_L 谢谢
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片