Hello,大家好!我是鸿,说C语言的知识典型到,指针肯定是一个绕不开的知识点。相信很多初学的小伙伴对指针是很恐惧的,但对学了指针的小伙伴来说指针是又爱又恨,虽然说指针理解起来可能有点晦涩难懂,但是今天我将用一些简单的例子带大家学习指针,希望我的分享能对大家理解指针有所帮助。
目录
一、地址
首先要对指针有很好的认识,我们需要了解一下数据在计算机中是如何进行存储的。当我们要存放一个数据时,我们首先得向内存申请一块空间,在生成这块空间的同时,也生成了这个空间的地址,然后才能将数据存储到这块空间去。例如图1,我们在内存中申请了四块空间,并得到了它们的地址。
图.1
二、指针的概念
既然我们得到了存储空间的地址了,我们通过这个地址就能找到我们想要的数据了。指针也就可以简单的理解为存储元素单元的地址。其实指针准确的含义是指针变量,指针是一种特殊的变量,用于存储另一个变量的地址。在C语言中,每个变量都有一个地址,指针变量可以存储这个地址,并可以通过该地址访问变量的值或者进行修改。
三、指针的使用
1.指针定义
要定义一个指针变量我们需要指定它的数据类型和名称例如:
int *p; //定义一个名为p的指向整型变量的指针
char *str; //定义一个名为str的指向字符型变量的指针
可以简单认为:数据类型+ “ * ”+名称就能定义一个指针变量。
2.初始化指针
要想对指针进行初始化可以在定义的时候给它一个地址值即可
int a = 10;
int *p = &a; //p指向a的地址
3.指针赋值
有了指针我们可以它进行赋值,通过取地址符号“ & ”可以获取存储单元的地址,然后赋值给指针变量就能对其进行赋值了。
int a = 10;
int *p ;//定义指针变量p
p=&a; //p指向a的地址
4.指针解引用
通运算符“ * ” 可对指针变量进行解引用,就能访问指针变量指向的值
int a = 10;
int *p = &a;
printf("%d", *p); //输出a的值10
四、指针的运算
指针的运算可以分为两类:指针和指针的运算,指针和整数的运算,
4.1 指针+-整数
指针加上一个整数意味着将指针的地址值增加相应的整数值乘以指针所指向的数据类型的字节数。
例如,假设一个指针 p 指向 int 类型的变量,其地址值为0x1000,int 类型占用 4 个字节,则执行 p + 1 的操作将使 p 的地址值增加 4,即变为 0x1004,指向下一个 int 类型的变量。
指针减去一个整数也是类似的,不同之处在于减号操作将整数视为负值,并将指针地址值向下移动相应的字节数。
4.2 指针+-指针
在指针的运算中,指针加减一个指针时,得到的是两个指针之间的元素个数。由于指针的加减运算涉及到访问内存地址,因此要特别注意避免指针越界或访问已释放的内存空间,这可能会导致程序崩溃或产生不可预料的结果。
五、指针和数组
在介绍指针和数组的关系之前我们需要了解一个知识,那就是,数组名。除了sizeof(数组名)和取地址数组名之外,数组名代表的都是数组首元素的地址。例如:
int A[7]={0,1,2,3,4,5,6};
int * p=A;//把数组首元素地址给p
运行结果:
六、野指针
野指针是指一个指向已经释放或未初始化的内存地址的指针变量。在使用野指针时,由于指针变量所指向的内存地址没有被正确地分配或释放,因此可能会导致程序异常终止、崩溃或数据损坏等问题。
为了避免野指针的出现,可以采取以下措施:
-
初始化指针变量:在定义指针变量时,要为其赋初值,即将其初始化为 null 或合法的内存地址。
-
及时释放指针所指向的内存:在使用完指针所指向的内存后,要及时进行释放,避免指针变量继续指向已经释放的内存地址。
-
避免重复释放内存:在释放内存时,要确保同一个内存地址只被释放一次,避免出现重复释放的情况。
-
校验指针的合法性:在使用指针变量前,要对其进行校验,判断其所指向的内存是否已经被正确地分配或释放。
七、总结
本文主要介绍了指针在C语言中的基本概念和用法。首先介绍了数据在计算机中的存储方式,以及指针的概念。其次详细讲解了指针的定义、初始化、赋值和解引用等基本操作,并介绍了指针的运算,包括指针+-整数和指针+-指针的运算。最后,介绍了指针和数组的关系,并提出了避免野指针的方法。本文适合C语言初学者和需要加强指针基础的读者阅读。