C语言系列--指针等特别总结

下面是我早我的微信公众号《Mark学编程》中的指针结束篇。如果要系统看这些相关内容,请关注,或联系我索取。

希望通过今天的总结,读者能够真正理解变量,数组,指针,函数等的基本概念,为进一步使用上述工具打下良好的基础。

如果你被好多书中,以及网络上大量的指针类讨论文章所迷惑,那很可能是概念搞混了,被误导了。因为很多人一会儿从机器的角度,一会儿从程序员的角度来谈论这些概念,造成了说法各一,往往思维并不连续,逻辑难以自洽。使人昏昏欲睡,不知所云。

我们使用程序员的角度,人的角度,不谈电脑的硬件,仅仅是谈到电脑的内存,并且是从概念上使用内存而已。

首先,来看变量,当我们定义或者声明变量时,最终使用变量后,三个要素都会陆续展现,这三个要素就是 类型,变量名,变量值。当然还有说明变量时提到的地址。比如,

int a;

a = 5;

int 是类型,为什么要用类型?因为电脑只能通过类型,才能得知需要安排多大的内存,比如int类型的变量,就需要在内存中开辟一块4个字节的空间,4个字节就是有4个连续编号的(地址)内存空间。这些编号已经被程序员们固定称做地址了。

尽管我们能够用 & 符号读出 a变量名所绑定的地址,但是我们没有必要用地址的概念来解释变量概念的相关内容。因为,那样就容易与指针相混淆了。

a 是变量名,当我们谈到变量时,他实际是包含上面所述的三个要素的,a 这个变量名是绑定在一块内存上的,就是上面说的四个地址的首个地址上的,可以很容易用 printf ("%d", &a); 来得到这个地址。我们使用这个int类型的地址时,也就是读或者写这块内存数据时,我们用变量名来代表,比如,我们给变量赋值,比如写入5这个值到这块内存,那么我们用赋值语句, a = 5; 搞定。不用什么地址不地址的。如果我们希望 a = a + 3; 那么电脑就从a 所绑定的地址中读出 5 那个值,然后加上3 等于8,再将8写入那块地址。

有了变量名,有了变量类型,还要理解这个变量值,变量值就是变量名所绑定的那块地址内的值。值是可以变动的,所以才叫变量。

关于变量,上面所述,仔细读几遍,然后反复练习,就掌握了变量这个概念。

指针变量,不是指针,不是指针,很多书上随便使用这两个词,误导了好多青年才俊。一个变量,如果他的值是另一个变量的地址时,那么这个变量就叫做指针变量。为什么把指针变量单独拿出来研究,因为,通过这种变量的值能够直接读写这个值对应的变量。之所以这么别扭的表达,是希望你知道,指针变量的值就是另一个变量的地址,通过这个地址可以读写这个地址内的变量值。不知道是必然还是偶然,反正人们就开始流行叫指针了。因为太像一个指针,指向了某个东西。注意,如果不用指针,直接使用地址这个名词的话,就不会产生歧义了。但是这个已经约定俗成,我们只好跟随,就把地址叫做指针了,这个指针就是指针变量的值。注意指针变量是通过地址间接的读写所指向的变量值,所以,和普通变量是不同的机制。

例如:定义一个指针变量 int * ip; ip = &a; 前一句是定义一个指向int类型的指针变量ip, 之所以加上一个 * 号,是因为没有的话,你无法与普通变量定义所区别,拿掉看看,剩下一个普通的变量定义声明而已。第二句,是把a变量名所绑定的内存地址 用 & 读出,然后赋值给ip, 注意,不是ip。这样一来,ip就通过a的地址直接读写a的值了。这样就和使用变量名a来读写其值是一样一样的。我们通过变量名读写它所绑定的内存值时,直接使用变量名a, 比如,可以直接运行 a - 5 等等。但是,为了表示我们是在使用指针读写所指向的变量值时,要加上ip 来表示,比如, ip + 6;就是a + 6; 这里的号和前面定义指针变量时使用的号,要看做不是同样的东西。 如果当你使用变量名时,数组名时,如果像函数那样,称作调用变量a, 调用数组XX。你就更加明白上面我谈的这些。这是我的发明。转发时要注明吆。

有人说,数组就是指针,这真是唯恐天下不乱。比如我们定义一个5个元素的int类型的数组,int b[5] = {5,4,3,2,1}, 在人类的眼中,b是数组名,是代表数组的,尽管你不能通过b来打印全部数组元素, 比如不能这样 printf("%d", a) 来显示所有元素; 只能通过 b[i],其中i是下标,来读写数组b的元素。但毕竟b是数组名,是整个数组的标识符。所以,不能简单的称,数组就是指针。等你熟练了,叫指针或什么的都没有问题。

数组从本质上说,是和指针一样的工作方式,因为,数组这个变量名,它的值是数组第一个元素的首个地址,如果你打印printf("%d,%d,%d", &b, b, &b[0])三个值是一样的。就说明数组名的值就是第一个元素的首地址,并且数组名是和变量名一样的。(通过测试,感觉数组名和变量名是一样的机制,不知道对不对,你不能说变量就是指针,同样你不能说数组就是指针)只能说,数组本质上是指针,运行方式和指针一样。

在C语言中,复杂的程序会被分成多个源文件,一个文件分成多个函数,一个函数分成多个语句。这就是整个程序的组成形式。函数的引入,是将大任务变成了小任务的组合,易懂容易修改等等优点自然显现出来了。

函数定义是函数的根本。函数名表示的是这个函数在内存中的首地址,所以可以用函数名来调用执行这个函数。说到这里,你应该明白我建议使用调用变量名,数组名等的意义了吧。因为,他们全部是一样的原理。

好了,函数一点而过吧,多了也不容易理解。

请参考下面的代码并加上自己的代码运行测试。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UncleMark编程

获取价值后的回馈,谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值