使用指针作函数形参遇到的问题及解决办法

首先看代码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)中有这样一段话

“从根本上看,指针是一个值内存地址的变量”,

希望这句话能帮大家“悟道”!

上一篇:[51nod : 2102][位运算] 或减与


下一篇:从0到1,完成恋爱话术微信小程序的开发到发布(开源,看了就懂~,2万字真香警告)