首先看代码1
#include<stdio.h>
void change(char* p)
{
p = "bbb";
}
int main()
{
char *v = "aaa";
printf("%s\n",v);
change(v);
printf("%s\n",v);
}
输出结果如下
aaa
aaa
可以看到主函数中的指针v指向的内存中的数据并没有发生变化
接下来看代码2
#include<stdio.h>
int change(int ar[])
{
ar[1] = 100000;
}
int main()
{
int marbles[3] = {0,1,2};
printf("%d\n",marbles[1]);
change(marbles);
printf("%d\n",marbles[1]);
}
结果如下
1
100000
可以看到主函数中数组的第二个元素发生了改变
--------------------------------------------------------------------------------------------------------------------------------
接下来查看各变量的地址
代码1
#include<stdio.h>
void change(char* p)
{
printf("p地址为%p\n",p);
p = "bbb";
}
int main()
{
char *v = "aaa";
printf("%s\n",v);
printf("v地址为%p\n",v);
change(v);
printf("%s\n",v);
}
aaa
v地址为000000000040400F
p地址为000000000040400F
aaa
代码2
#include<stdio.h>
int change(int ar[])
{
printf("ar地址为%p\n",ar);
ar[1] = 100000;
}
int main()
{
int marbles[3] = {0,1,2};
printf("%d\n",marbles[1]);
printf("marbels地址为%p\n",marbles);
change(marbles);
printf("%d\n",marbles[1]);
}
1
marbels地址为000000000062FE10
ar地址为000000000062FE10
100000
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
这个时候关键的问题已经凸显出来了,代码1中的指针p和指针v指向的是同一块地址,那为什么在
p = "bbb";
之后,指针v指向的内存中的数据却没有变化?
#include<stdio.h>
void charge(int a,int b)
{
int c = a;
a = b;
b = c;
printf("--------------------\n");
printf("charge()中\na=%d\nb=%d\n",a,b);
printf("a地址=%p\nb地址=%p\n",&a,&b);
printf("--------------------\n");
}
int main()
{
int a = 1;
int b = 2;
printf("a=%d\nb=%d\n",a,b);
printf("a地址=%p\nb地址=%p\n",&a,&b);
charge(a,b);
printf("a=%d\nb=%d\n",a,b);
}
a=1
b=2
a地址=000000000062FE1C
b地址=000000000062FE18
--------------------
charge()中
a=2
b=1
a地址=000000000062FDF0
b地址=000000000062FDF8
--------------------
a=1
b=2
此处变量地址都已经改变,所以很好理解。
那么对代码1的解释只有,char *v在被传到charge(char *p)中时,产生了“替身”!
参考博客(54条消息) 如何理解双重指针_Hist_花透的博客-CSDN博客_双重指针
char *x就是那个“凭空出现的替身”!!!
解决办法就是使用双重指针,代码如下
#include<stdio.h>
void change(char **p)
{
printf("p地址为%p\n",p);
*p = "bbb";
}
int main()
{
char *v = "aaa";
printf("%s\n",v);
printf("v地址为%p\n",v);
change(&v);
printf("%s\n",v);
}
aaa
v地址为000000000040400F
p地址为000000000062FE18
bbb
至于为什么会产生替身,我也不知道......欢迎大家评论解答!
在《C Prime Plus》中第九章(9.7)中有这样一段话
“从根本上看,指针是一个值内存地址的变量”,
希望这句话能帮大家“悟道”!