指针——C语言的灵魂

前言

指针这个环节一直是我不敢写的一个部分,因为他实在太重要,C语言的优点基本都是因为指针所诞生的。

变量与地址

我们可以把计算的存储理解成一个教室,每一个教师都能进学生,而且教师也有着门牌号
所以我们就可以就可以将变量看成上面的学生,而门牌号就是其中的地址。
再比如,int a =0;
在这个里面a就是变量,&a就是他存放的地址
其实指针就是地址,它指向一个房间号
以我现在的理解就是,在系统中,每一个物理内存都有它的编号,也就是地址,这样就方便系统去调用,同样的也有着不同的存储分区

指针和指针变量

我们经常说到指针就是地址,地址就是一个常量,是不可改变
但是我们又经常的说到把指针值向谁,这里的指的就是指针变量
在这里插入图片描述
什么意思呢,上面图中0x158黑色的外壳就是我们通常说的指针,他是不会变化的,是固定的地址,不过他里面存放的是另外一片空间的地址,存放的是哪里的地址,他就指向哪里,图中的0f113就是指针变量,他指向了一个地址

直接访问与间接访问

我们先举一个例子,这时候我们就获得了以下的关系图

int i =1;
int *p =&i; //建立一个指针指向i,也就是将 i 的地址赋值给 p

在这里插入图片描述
他们就获得了这样的一个关系,i在栈区申请到一片空间,获得了地址,并为他赋值1,然后创建了一个指针,用他的指针变量存储 i 的地址,这样 p 就指向了i。
直接访问就是可以进行 i=10;这样直接进行赋值操作
间接访问就是可以可以通过间接访问符 * 来来间接的通过指针来访问, *i = 10
如果再有一个指针,他就可以指向p的地址,这样就是构成了二级访问

二级指针与多级指针

二级指针其实就和一级指针一样,原理是一样的,就是多了一层引用,以二级指针为例子

int i =1;
int *p =&i; //建立一个指针指向i,也就是将 i 的地址赋值给 
int **pi = &p; //将新的指针指向原来指针的地址,构成二级指针

这时候,pi又创建了一份空间,他里面存的是指针p的地址
所以 对pi进行访问就是p的地址 *pi == p
对 pi进行两层访问就就是i的值 **p== i == *p
他们都是等价的,所以二级指针和多级指针就是多层的调用关系

指针的大小和类型

指针的大小 指针的大小取决于机器的位数,64位的就是8个字节,32位的就是4个字节
在int * p=&a;中他的类型是 int * 变量名是p,&a是地址,而且要去后面的地址是一个合法的地址,要有明确的指定

空指针和野指针

空指针:int *pa =NULL;
这其中就NULL是系统的一个宏,它指向系统地址的0号位置,他不允许任何人修改,所以当有人去访问的时候,编译器都会报段错误,是一种放错的手段
野指针:就是不知道指向何处的指针

指针数组

就是用一个指针去指向数组的首地址

int a[2]={1,2};
int *p = a;

这样就可以去做类似于数组的运算
就比如 a =p a[2]=*(p+2)
p+2=&a[2]

数组指针

储存类型 数据类型 * 数组名 【长度】
int * arr [3] 也就是存储了3个指针

char *arr = ["sss","ccc","sdsd"];
for (int i=0;i<3,i++)
{
	printf ("%s ",arr[3]);
}

这样就可以用数组指针来获得三个字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值