C语言指针系列

Posted Jack Chao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针系列相关的知识,希望对你有一定的参考价值。

在学习任何知识之前,我们都要知道这个知识是什么东西。那么我们这次要学习的指针是什么呢?
说到指针,我们的第一反映是什么
在这里插入图片描述
在这里插入图片描述
会不会有人跟我一样,想到是这种有指示作用的指示牌。同样C语言当中的指针也是这样的。
其实在我看来C语言的环境就是地球的环境。我们就是一个个变量,地球就是存储器。我们在这里面游荡。我们怎么证明我们活过呢?那就是你现在所处的地方,你在这个地方,就好像一个变量出现在这里进行了一次运算,这个变量来过,这个我,活过。
因为代码与人生的相似性,让我深深迷恋。
话说回来,那么指针的作用就是证明这个地方有你。可以说,指针就是地址,地址就是指针。

那我们来看看一段代码:

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	printf("%d", a + b);
	return 0;
}

这段代码大家应该都比较熟悉吧。就是一个简单的加法。那此时我们想知道这个a在哪里,我们应该怎么办呢?正如我们之前说的指针证明着这个变量来过。

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int* pa = &a;
	printf("%d\\n", a + b);
	printf("%p", pa);
	return 0;
}

当你运行这个代码的时候你可以看到两个输出。一个是加法之后的答案,一个就是变量a所在的地方。比如我现在在寝室,那么我的指针就是某某大学某某幢某某寝室。这个就是指针。* 这个符号就是用来标识,这个变量是指针。& 这个符号就是提取地址的一个符号。
我们都知道,一个事物的存在一定有他的道理,那这个道理是什么呢?首先,指针很快,很方便。这个是我老师告诉我的。我同样也在消化。然后我接触了一些代码。

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int* pa = &a;
	int* pb = &b;
	printf("%d\\n", a + b);
	printf("%d", *pa+*pb);
	return 0;
}

当我们运行这个代码的时候,我们发现,两个答案都一样,是30;那为什么呢?* 这个符号不是用来标识的吗?其实这个符号有另一个作用。我们这么想,我们买快递的时候是不是有那么几个步骤。货源发送,快递员依据地址送到你家,之后你是不是利用工具拆开快递。同样当我们的pa(pb)指针变量(快递员)利用&这个符号知道了变量a(b)的地址,然后把快递送过去之后。a(b)这个人利用 * 这个工具拆开了快递来使用。
这个就是变量全部经过的解释。
那很多人一定和我一样很困惑。不对呀,我们一开始只要写a+b就好了,现在你这个指针变量一来。我要写*pa+*pb这么多东西。我吃饱了撑的?其实这个远远不是指针应该做的事情。
我们看下一个代码:

void exchange(int a, int b)
{
	a = b;
}
int main()
{
	int a = 10;
	exchange(a, 5);
	printf("%d", a);
	return 0;
}

我这个代码是利用exchange这个自定义函数,来改变a这里面的值。大家觉得这个代码对不对。
你运行之后就会发现,这个代码是不正确的。你输出的还是原来的值。我们这么想,你爸爸让你去接你弟弟放学。然后你去网吧呆了一个晚上,等你回家之后,你爸爸问你,昨晚去哪了。你说你去网吧了。造成这个原因的是什么。我们接受到了接弟弟回家这个消息,但是我们没有弟弟学校的地址。我们是不是找不到弟弟,也接不回来。同样,我们在这个代码里面。我们要改变里面的值,我们应该怎么办。我们是不是要传地址。
学到之后我们就知道了,这个是形参不改变实参的值。现在我们只要知道接弟弟的这个列子。
那我们正确的代码是什么呢?
我们思考一下。是不是应该在传的时候我们应该传的是地址。那我们之前知道的,获取地址的符号是什么?是不是 & 这个符号。
那我们在传的时候就应该写成

exchange(&a, 5);

这样子我们就把这个变量的地址传过去了。我们也知道了弟弟的地址。
那我们的函数在接收的时候,是不是应该做到,变量的属性一致的原则。

void exchange(int *a, int b)

之前这个函数就应该被改变了。
那我们在函数里面是不是也应该改一下。

void exchange(int *a, int b)
{
	*a = b;
}

到这之后我们的代码就算是全部改完了

#include<stdio.h>
void exchange(int *a, int b)
{
	*a = b;
}
int main()
{
	int a = 10;
	exchange(&a, 5);
	printf("%d", a);
	return 0;
}

以上只是代码很基础的一部分。我只是希望大家先理解代码是什么东西。之后还会有跟进。
如果还有不知道的可以私信。我看到之后会尽量回复的。
我希望和大家一起进步。谢谢

以上是关于C语言指针系列的主要内容,如果未能解决你的问题,请参考以下文章

C语言指针系列

C语言指针系列

知识分享:C语言知识系列——指针篇

C语言指针系列

C语言指针系列

C语言指针系列——并不可怕的声明