什么是指针
在C语言中,指针就是变量, 数组,函数在内存中分配的地址。我们口头说的指针其实指的是指针变量。CPU与内存之间连着地址线,有的是32根地址线,有的是64根。这些地址线会产生正电或负电。这些电信号就可以转化为数字信号,及正电为1,负电为0。这样我们就可以用二进制为内存编码。这些编码就是内存的地址,而这些地址就是指针变量。这里值得注意的是并不是一块内存对应一个不变的地址(编号),内存本身只是一块空间,这块空间并没有编号,只是编译器在分配内存的时候赋予该空间编号。一个编号对应一个字节的的大小。
我们知道编译器为一个int类型的变量开辟的空间占4个字节。那如果要把一个地址存放到指针变量中,需要为指针变量开辟多大的空间呢?我们可以从地址线分析,假设是32根地址线,一个编号就有32个0或1,1个0或1占一个比特位,8个比特位占1字节,32个比特位占4个字节。也就是说在32位环境下指针变量的大小为4个字节,同理,64位下为8个字节。
理解指针
int a = 0; int * p = &a;
知道了指针的定义,我们要如何理解上述代码呢?
首先,编译器为a开辟了一块4个字节大小的空间并且初始化为0,编译器自然会给这块空间进行编号,假设为0x005afd58,那么a的地址为0x005afd58。然后我定义了一个p变量,p旁边的 * ,说明该变量是一个指针变量。而 * 旁边的int说明p指向的对象为整形,取出a的地址(0x005afd58)赋给指针变量p。
接下来我要重点说一下 * 旁边的 int,请看如下代码
int a = 0; int * p1 = &a; char * p2 = &a;
我刚才说 * 旁边的类型,表示指针所指向对象的类型。其实它有两个作用,1,一次性访问指针所指向的对象的权限(大小)。2,指针加减整数所跳跃的大小
先说1,因为a的地址是4个字节,而我p1的 * 的旁边是int类型,所以我一次性能够访问的大小为4个字节,刚好能访问a的全部内容。同理,我p2的 * 的旁边是char类型, 所以我只能访问a的一个字节的内容。
其次是第2个作用,这个比较好理解,比如“ p2 + 2 ”, 表示p2从起始位置往后跳过 一个字节乘以二。
如果上述内容对你有帮助的话,能不能给个赞呢(手动狗头)