C语言天花板——指针(初阶)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

大家在刚刚接触C语言的时候就肯定听说过指针的重要性以及难度等级以至于经常“谈虎色变”但是今天我来带大家走进指针的奇妙世界。


一、什么是指针

指针理解的两个要点

1️⃣指针是内存中一个最小单元的编号也就是地址

2️⃣平常口语中说的指针通常指的是指针变量是用来存放地址的变量

数据存储在内存中是以二进制的方式进行存储的每一个二进制找到它对应的地址存储起来

例如这样的一个整型变量a在内存中他的存储方式就是

我们可以看到这样一个一个的格子这一个格子便是我们的内存单元单位是字节上面代码中的整型变量a就占四个字节也就是图中红色区域开辟的空间里面存的就是变量a。                                                                                                                                                                                                                                                               单元编号 == 地址 == C语言中的“指针”

二、指针类型 

同数据类型一样指针也分各种类型如图

值得注意的是指针大小是固定的在32位的环境下占4位64位的环境下占8位

那么在抛出一个问题既然所占字节大小都一样为什么还要区分指针类型呢

指针类型有意义么

1️⃣指针类型决定了在解引用操作的时候访问了几个字节

在int类型的指针中解引用会访问4个字节

在char类型的指针中解引用只会访问1个字节

2️⃣指针类型决定了指针在+1/-1跳过了几个字节

三、野指针

概念指针指向的位置是不可知不确定的随机的。

野指针成因

1️⃣指针未初始化

2️⃣指针越界访问

3️⃣ 指针指向的空间释放

如何规避野指针

指针初始化

避免指针越界

指针指向的空间释放指针及时置NULL

避免返回局部变量的地址

指针使用之前检查其有效性

四、指针运算

1️⃣整数加减整数

指针+-整数->实际上是移动了一个指针类型的大小而指针大小一般是4/8个字节

int main(){
    int arr[] = { 10,9,8,7,6,5,4,3,2,1 }
    int* p = arr;
    p++;
return 0;
}

2️⃣指针-指针

前提两个指针指向的是同一块区域指针类型是相同的

int main()
{
	int arr[10] = { 0 };
	//指针-指针的前提两个指针指向同一块区域指针类型时相同的
	//指针-指针差值的绝对值指针和指针之间的元素个数
	printf("%d\n", &arr[9] - &arr[0]);
	printf("%d\n", &arr[0] - &arr[9]);

	return 0;
}

结论指针-指针得到的差值的绝对值是指针与指针之间的元素个数

五、二级指针

概念二级指针变量是存放一级指针变量的地址的

int main()
{
	int a = 10;
	int* p = &a;//p是指针变量一级指针变量
	int** pp = &p;//pp指针变量二级指针变量
	//int** * ppp = &pp;//pp是指针变量三级指针变量
	//......
	return 0;
}

其实指针不止有一级指针和二级指针还有三级四级甚至是多级但是我们在正常情况下很少可以用到。

六、指针数组

指针数组是指针还是数组

答案是数组是存放指针的数组

字符数组存放字符的数组

整型数组存放整形的数组

指针数组存放指针地址的数组

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	//指针数组
	int* arr[] = { arr1,arr2,arr3 };
	return 0;
}

注意数组名可以表示首元素的地址

今天我们的指针就讲到这里之后我还会更新一些更高阶的指针感谢大家的支持

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6