都说c语言指针功能强大,我怎么体会不到呢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了都说c语言指针功能强大,我怎么体会不到呢相关的知识,希望对你有一定的参考价值。

假设p指向a,那么a=b和*p=b是一样的,所以可以不用指针。数组名可以代替指针。结构体数组也可以用数组名代替指针。链表是把一条蛇切成一段一段,然后重新拼成一条蛇。实在搞不懂指针有什么强大的,求救

首先要明确C语言的用处
C语言现在在大多数IT行业里认为是非主流的,因为大多数IT行业是互联网公司,多数用java等面向对象的语言,他们的重点不在速度不在效率。
但是实际上C语言只是在大家不熟悉的地方使用,比如windows和linux的内核,比如通信行业的流传输。这些基本上都是C语言在搞,因为java之中面向对象的语言无法满足这些地方的效率,而只有C这类高效率的面向过程的语言才能满足这类需求。
什么是面向过程,通俗点讲就是细节,一个人是由胳膊腿躯干头组成的(java),血管和肌肉就是细节(c)。四肢的移动速度可以按秒计算,血液的流动怎么按秒计算呢?
那为什么C语言的效率高呢,最直接的表现就是指针。
你举得例子a=b和*p=b是一样的,这个没问题,java一般都是a=b这么用,换算成指针就是*p=b。但是C语言大部分的赋值都不会考虑*p=b,为什么,因为效率低,C语言一般是p=&b这么来写,我不需要赋值,我只是搬运工,如果b这个结构体有1M这么大,那a=b相当于拷贝了1M的内存而p=&b只不过一个四字节的内存操作而已,前者也许要耗费1ms,后者如果按字节数来算的话 你可以想象效率提高了多少数量级。
更别说什么回调函数啊,结构体里存指针比存整个结构体省内存啊之类的了。追问

呵呵,很满意,受益匪浅

参考技术A 指针强大?你听谁说的?由于会造成内存溢出,现在没有任何一个实质性的程序用C指针,现在大学学指针无非就是开发一下智力。

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语言 怎样区分指针常量和指针变量?