详解指针(初阶)

简介: 详解指针(初阶)

什么是指针

在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从起始位置往后跳过  一个字节乘以二。

如果上述内容对你有帮助的话,能不能给个赞呢(手动狗头)

相关文章
|
存储 编译器
初阶指针(详解)
初阶指针(详解)
33 1
|
存储 C语言
让你不再惧怕指针——C语言指针及指针进阶详解(上)
让你不再惧怕指针——C语言指针及指针进阶详解(上)
让你不再惧怕指针——C语言指针及指针进阶详解(上)
|
4月前
|
存储 程序员 C语言
【C初阶】初识指针
【C初阶】初识指针
|
6月前
|
存储 编译器 Perl
指针初阶(1)
指针初阶(1)
35 0
|
6月前
指针初阶(2)
指针初阶(2)
32 0
|
存储
初阶指针(纯干货!!!)上
初阶指针(纯干货!!!)
70 0
|
存储 编译器
指针(初阶)
指针(初阶)
64 0
|
存储 C语言 C++
让你不再惧怕指针——C语言指针及指针进阶详解(下)
让你不再惧怕指针——C语言指针及指针进阶详解(下)
让你不再惧怕指针——C语言指针及指针进阶详解(下)
|
编译器
初阶指针(纯干货!!!)下
初阶指针(纯干货!!!)
61 0