在函数中,用指针接收就可以改变相应的内容吗??

作者:小树苗渴望变成参天大树
作者宣言:认真写好每一篇博客
作者gitee:gitee
在这里插入图片描述如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!


我们在不管指针那篇博客,还是在函数那篇博客中,我都给大家讲解过,传值和传址的区别,但今天为了把知识点串连起来,让大家更好的理解,在讲解一遍传址和传值,也相当于给大家做复习了。

举个例子:通过函数交换两个整型的值

void Swap(int a, int b)
{
    
    
	int tmp = a;
	a = b;
	b = tmp;
}

在这里插入图片描述
我们发现通过这个函数,没有办法交换两个数,原因是这是值传递,为什么值传递不行呢??我将画一个图让大家理解:
在这里插入图片描述
我们来看一下传址可不可以:

void Swap(int* a, int* b)
{
    
    
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
int main()
{
    
    
	int a = 10;
	int b = 20;
	printf("交换前:a=%d b=%d\n", a, b);
	Swap(&a, &b);
	printf("交换后:a=%d b=%d", a, b);
	return 0;
}

在这里插入图片描述

看到这里相信大家对为何修改数据需要用指针接收了吧,但是只要用指针接收的都可以改变里面的数据吗??我们再来看一个例子:

void Address(int* a)//传一级指针,用一级指针接收
{
    
    
	a = 0x11223344;
}
int main()
{
    
    
	int* a = 0x1122ff44;//假设a里面存放是一个整型数据的地址
    printf("a之前的地址:a=%p\n", a);
	Address(a);
	printf("a之后的地址:a=%p", a);
	return 0;
}

在这里插入图片描述
我们看到我们的a的地址并没有改变,这是为什么呢??
原因是我们a里面保存的虽然是地址,但地址是地址编号,是数值,实际上也是值,那我们怎么去做呢??
我先画一个图让大家理解一下:
在这里插入图片描述

所以看我们定义的什么类型的数据,就要使用相应的类型去接收,才能改变里面的内容,整型,就用一级指针。是一级指针,就用二级指针接收。那我们怎么修改上面的案例呢??

void Address(int** a)
{
    
    
	*a = 0x11223344;
}
int main()
{
    
    
	int* a = 0x1122ff44;
    printf("a之前的地址:a=%p\n", a);
	Address(&a);
	printf("a之后的地址:a=%p", a);
	return 0;
}

在这里插入图片描述
看到这里我相信大家有了更深一层的理解了吧

对于机器而言传值和传址都是传值,没有区别,但我们作为使用者,这么说有利于学习和区分

这时候大家在去看看我写的关于单链表的博客,就可以更好的理解为什么传二级指针,观察一下函数体看看那些需要改变指针里面的数值。单链表

猜你喜欢

转载自blog.csdn.net/qq_69369227/article/details/129290818
今日推荐