C语言系列-指针(二)

今天,先从CSDN博客首发。继续昨天的指针,重点是指针与数组。我还是想大家说一下,这个英文教材的作者,一位是Bran W. kernighan, 一位是 Dennis M. Ritchie; 网上查查吧,都是大名鼎鼎的人物,这边书据说广为人知,也有中文译本,我没有看到,我还是喜欢直接看英文。更正一下前面几节,我可能说过是作者是C语言的创立者,仔细看介绍,作者不是的,是C用于LINUX源码的创立者。好了,开始指针与数组的学习。
In C, there is a strong relationship between pointers and arrays, strong enough that pointers and arrays shoud be discussed simultaneously. Any operation that can be achieved by array subscripting can also be done with pointers. The pointer version will in general be faster but, at least to the uninitiated, soewaht harder to understand.
这段讲的主要是,在C语言里,数组和指针紧密相连,应该同时讨论。通过数组下标能做到的指针也能做到。数组下标就是数组元素的索引,比如 int a[10] 里面有10个int 类型元素,每个元素都用a[i] 来表示,这个i就是下标。比如a[3]是第四个元素。作者有支出,指针的版本一般的更快,应该是说用指针代码程序速度更快,但是(只少对外行来讲)更难理解。
The declaration
int a[10];
defines an array of size 10, that is, a block of 10 consecutive objects named a[0], a[1], …, a[9].
The notation a[i] refers to the i-th element of the array. if pa is a pointer to an integer, decalared as
int *pa;
then the assignment
pa = &a[0];
sets pa to point to element zero of a; that is, pa contains the address of a[0].
先解释,如果我们声明一个 叫 a 的数组,并且指明 a 有 10 个元素,我们就定义了 10 个连续的在内存中的 object(变量)分别是 a[0], a[1],…, a[9], 0开始大家都明白,计算机惯例,英文object放在这里很合适,但如果翻译成物体,显然不合适,翻译成类中的那个对象,也太早,因为大家在这个阶段还不知道什么是对象。所以,我还是索性叫变量,因为数组里面的元素可以看做变量。这段话,还表达了块内存的思想,仔细体会。a[i],指第i个数组元素。如果 我们定义一个指向 int 类型的指针,名字叫 pa, 仔细看上面那个定义格式。然后,我们将数组a的第一个元素的首地址赋值给指针pa. 那么pa就指向了数组a的0元素,就是第一个元素。也就是说pa的值就是a[0]的地址,还是首个地址,这个说法是我添上的,因为,有的读者可能不知道。
借这个机会,我们再梳理一下地址这个概念以及他究竟是什么?最简单的来说,电脑是由CPU和内存组成,内存是存储数据的,没有内存就无法存储数据,程序没有数据就相当于无米下锅了。那么内存是什么,这个物理性的东西,大家应该多少知道点,但不是我们的重点。内存在电脑中就是存储数据的,他由一个个单元组成 ,逻辑上的单元,程序员只需要知道逻辑上(因为我们也难以搞清是多少晶体管或其他什么其他东东组成),每个单元有一个编号,这个编号就是我们通常说的地址,这个编号或叫地址代表多少多大呢?就是一个字节的大小,而一个字节是由8位组成的,举个例子,一个字节可以存放8位2进制数字,比如 0000 0001;1111 1111;等等。打个具体的比方,8位就是8个排成一列的开关(晶体管?)假设开是1关闭是0,这个8个开关就是一个有着8位的或0或1的数字了。这就是一个字节。当然,一个开关叫做一个位,仅仅可以表示两个状态1和0。
具体到C语言,数据的不同类型,在计算机程序中需要的空间不一样,就是需要的内存单元不一样,比如int类型,(因为不同计算机不同系统可能不同)需要4个字节,就是4个地址(4个编号),那么double类型可能需要8个,等等。
接着上面的例子,a 数组是 int 类型的,它的元素是int类型,每一个元素,需要4个地址,所以a数组如果从1001编号开始的话,就需要20个地址,从1001到1020编号。首个元素就用在1001,1002,1003,1004这4个地址里的开关状态(0/1)来表示。而a数组这个名字就绑定在首个元素首个地址上。我们看代码运行结果:

在这里插入图片描述
在这里插入图片描述
上面代码定义了一个int类型数组叫做a; 然后打印数组a的地址,第一个元素的地址,第二个,第三个。看运行结果,a 的是6487536,a[0]第一个元素 也是6487636,第二个元素是6487540,是第一个元素加上4得出,第三个是第二个加4,所以不难得出这个地址是元素地址的首个地址。奥,对了,可以用sizeof这个函数来查出变量的大小,也就是字节数,无疑,每个元素都是4了,整个a 是多少?试试看。

以上需要时间消化,就停在这儿吧。下次再见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

UncleMark编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值