详解指针(C语言)

1.指针是什么

指针是什么?
指针也就是地址,我们一般说的指针指的是指针变量,是用来存放最小内存单元地址的变量。
指针理解的两个要点:
1.指针是内存中的一个最小单元的编号,也就是地址。
为了管理内存,将内存划分成一个一个小的内存单元,这些内存单元的大小是一个字节,每一个内存单元都有唯一的一个编号,这个编号就是地址。
地址的编号是如何产生的?
32位机器上有32根物理的电线,通电就会产生高低电平之分,我们可以将电信号转换成数字信号1和0,那么如果是32根地址线,就对应32个1和0,每一个都有两种可能,那么32根地址线组成的序列就有2^32个,这些序列就是地址,64位同上。(32位,64位表示的是可以管理内存的能力,不一定64位内存就一定大。)
2.平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
指针变量,
我们可以通过&(取地址操作符)去除变量内存的起始地址,把地址存放到一个变量中,这个变量就叫做指针变量。

#include<stdio.h>
int main()
{
	int a = 10;//一个整型变量a  在内存中开辟一块空间
	int* p = &a;  //这里我们对变量a使用&操作符取出他的地址
	 //这是一个指针变量,变量名为p,p中存放的是a的地址
	//*表示p是一个指针,而int表示的是指针变量p指向的变量类型为整型
	//a变量占用4个字节的空间,,这里是将变量a所占四个字节的第一个字节的地址存放在p中
	printf("%p", p);
	//地址用%p来打印
	return 0;
}

总结一下:
指针变量就是用来存放地址的变量(存放在指针中的值都会被当做地址来处理)
指针的大小到底是多大呢?
在这里插入图片描述

前文我们提到在32位的机器上,地址是32个0或1组成的二进制序列(32个比特),那么地址就需要4个字节来进行存储,所以一个指针变量的大小就是4个字节(32/8)。
那么在64位的机器上一个指针变量的大小就是8个字节
综上所述:
指针变量是用来存放地址的,地址是唯一标示一内存单元的。
指针的大小,在32位的机器上是4个字节,但是在64位的机器上是8个字节。

2.指针和指针类型

这里我们讨论一下指针类型
我们知道,变量有不同的类型,整型,浮点型等等,那么指针有没有类型呢?
准确的说是有的。
在这里插入图片描述
其实char类型的指针是为了存放char类型的变量的地址
short
类型的指针是为了存放short类型变量的地址,
int类型的指针是为了存放int类型变量的地址……
所以指针变量的类型是有意义的,不可以因为在一个环境下是固定的四个或是八个字节就统一的将指针变量都设置成一个类型。
那么指针类型到底有什么意义呢?
1.指针的类型可以决定指针解引用的时候访问多少个字节(指针的权限)
2.指针类型决定指针+/- n操作时跳过的步长。
步长=n*sizeof(type)
在这里插入图片描述

3.野指针

概念:野指针就是指针指向位置是不可知的(随机的,不正确的,没有明确限制的)
野指针的成因:
1.指针未初始化
在这里插入图片描述

2.指针越界访问
在这里插入图片描述

3.指针指向的空间释放
在这里插入图片描述
我们该如何避免野指针??
1.指针初始化
1.1在明确指针该初始化为何值的时候,就初始化为何值
1.2在不知道该初始化为何值得时候,就初始化为NULL
(NULL表示的是0,是空指针)
这表示的意思是告诉你ptr是一个空指针,这个指针不可以直接使用,这是一个空指针没有指向任何一个有效的空间。
2.小心指针越界
3.指针指向的空间释放后及时的置为NULL
4.避免返回局部变量的地址
5.指针使用之前检查有效性

4.指针运算

1.指针±整数
1.1可以实现不使用下标访问数组
在这里插入图片描述

2.指针-指针
!运算前提,两个指针只想的是同一块空间
得到的数值的绝对值是指针和指针之间元素的个数

3.指针的关系运算
实际上就是比较指针的大小
C语言标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

5.指针和数组

指针就是指针,不是数组,它的大小是固定的,专门用来存放地址,
数组就是数组,不是指针,数组是一块连续的空间,可以存放一个或者是多个类型相同的数据。
二者之间的联系:
数组中,数组名其实是数组首元素的地址,数组名=地址=指针
首先,我们可以先看一个例子
在这里插入图片描述
可见数组名和数组首元素的地址是相同的
所以:数组名表示的是数组首元素的地址
(出了两种情况 1.&数组名 2.sizeof数组名)
那么数组名也是地址即指针,我们可以使用指针变量来存放数组名。我们可以用指针来访问数组。

6.二级指针

指针变量也是变量,是变量就有地址,那么指针变量的地址要存放到哪里呢? 那就是二级指针
作用:存放一级指针变量的地址的。
在这里插入图片描述
三级同上。

7.指针数组

指针数组是指针还是数组??
当然是数组,是存放指针(地址)的数组。
数组我们都知道,像是有整型数组,字符数组等等
例如下面的数组就是整型数组。
在这里插入图片描述
模拟二维数组
在这里插入图片描述
但是实际上他和二维数组并不一样,二维数组在内存中十连续存放的,但是我们的模拟出来的,上面的每一个arri 在内存中不是挨着存放的。

今天的内容就到此为止啦,若有不足还请大家指正,下期是初阶结构体详解,咱们下期见哦~~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值