指针是C语言至关重要的一部分,相信有很多同学对于本部分知识有许多不明白的地方,但是,相信你认真阅读并思考本篇文章所涉及的知识后,一定能有更深的理解与感悟。
一.内存与地址
1.内存与编址
中央处理器(cpu)在处理数据时,需要的数据是从内存中读取的,处理后的数据也是存放在内存中,那这些内存空间是如何被合理规划的呢?
其实就是把内存划分为一个个内存单元,而每个内存单元的大小为一个字节。每个内存单元都有一个编号,而cpu则可以根据这个编号找到相应的内存空间,我们可以把这个内存空间称为地址,而在C语言中,它有一个新的名字——指针。
那么,我们如何理解编号与地址呢?这时候我们需要介绍一组线——地址总线。CPU与内存之间的数据如果要进行传递,必须用“线”连接起来,而地址总线恰好可以承担这个任务。我们举个例子,例如32位机器有32根地址总线,每根线可以发出1或0两种脉冲,因此32位机器发出2^32种含义的脉冲,每一种代表一个地址。
二.指针变量与地址
1.取地址操作符 &
在C语言中,创建变量就是向内存申请空间,而我们可以通过取地址操作符&,取出我们所需要的地址。
需要注意的是,我们所打印出来的是第一个字节的地址,而整型占四个字节,我们可以顺藤摸瓜找到四个字节的数据。
2.指针变量和解引用操作符
看下面这个例子,当我们看到int*pa,我们需要知道的是,*代表pa是指针变量,int代表指针变量pa指向的是整型类型的对象:
int a=4;
int *pa=&a;
我们通过指针变量保存了对象的地址后,当我们需要用到这个对象时,该如何解引用指针变量呢?这时就需要用到解引用操作符*:
int a=4;
int *pa=&a;
*pa=0;
这时我们就通过解引用将a的值更改。
3.指针变量的大小
前面我们已经说到过,在32位机器中,有32根地址总线,每条总线发出1或0的脉冲,那么一个地址就拥有32个bit位,需要4个字节才能存储,因此在32位机器下,指针的大小为四个字节,以此类推,在64位机器下,指针的大小就是8个字节。
因此需要注意:指针变量大小与类型无关只要为指针,不论是字符型指针,还是整型指针,只要在相同的平台,大小都是一样的。
三.指针变量类型的意义
1.指针的解引用
上文说到指针变量的大小与类型无关,但是指针变量类型却有他存在的独特意义。
指针的类型决定了对指针解引用时有多大的权限,也就是一次能操作几个字节。
例如,char*指针解引用时只能访问一个字节,而int*可以访问四个字节。
2.指针+-整数
我们来看一段代码:
由此可以看出,指针类型决定了加减整数时移动的步长有多大。
3.void*指针
void*类型的指针可以理解为无具体类型的指针,这种指针可以用来接收任意类型的对象,但是它也有局限性,void*指针不可以解引用,也不可以进行加减整数的运算。
四.const修饰指针
由上面的程序我们可以得出以下结论:
当const放在*左面时,指针变量可以被更改,但是指针指向的内容不可以通过指针被更改;
当const放在*右面时,指针变量不可以被更改,但是指针指向的内容可以通过指针被更改。
五.指针运算
指针的基本运算有三种:
(1).指针+-整数
(2).指针-指针
(3). 指针的关系运算
1.指针+-整数
指针在数组中是连续存放的,当我们知道第一个元素的地址后,可以通过指针+-整数来找到其他元素的地址。例如:
2.指针-指针
指针-指针用来表示两个地址间相差的元素的个数(仅适用于位于同一块空间的指针)。
指针-指针可以用来模拟strlen函数的实现:
3.指针的关系运算
在这个程序中,两个指针进行了大小的比较。
关于指针(一)的讲解就到这里了,感谢大家的阅读,如有错误,感谢指正,我们下文再会!