前言
对C语言指针基础的回顾
本文对指针、野指针、指针类型的内容进行介绍
在指针基础篇(2)中进行对指针运算、指针和数组、二级指针、指针数组进行介绍
如果有帮助,还请各位小伙伴多多点赞关注收藏,后期会持续进行更新!!!
文章目录
- 前言
- 一、什么是指针
- 1.指针变量
- 2.指针的大小
- 二、指针类型
- 1.指针变量类型
- 2.指针类型的意义
- 指针类型间的差别
- 指针的解引用
- 三、野指针
- 1.什么是野指针
- 2.野指针成因
- 3.如何避免野指针
- 四、总结
一、什么是指针
简单来说,指针就是地址是内存中一个最小单元的编号
用来存放内存地址的变量通常被称为指针,即为指针变量
1.指针变量
用来存放地址的变量,叫做指针变量,在这个变量中存放的是地址
下面用代码举个例子
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 10;
int* pa = &a;
printf("%p", pa);
return 0;
}
输出结果
这里的pa指针变量是用来存放a的地址
指针就是内存
2.指针的大小
在内存中指针的大小在不同的机器中是不同的
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
在64位机器上,有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
指针的大小在 32 位平台是 4 个字节,在 64 位平台是 8 个字节
二、指针类型
1.指针变量类型
变量有不同的类型,指针变量也有
指针类型可以分为以下几类:
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
同理得
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
2.指针类型的意义
为什么会有这么多类型? 不同类型指针的大小有没有区别?
指针类型间的差别
用代码举个例子
#include <stdio.h>
int main()
{
int a = 10;
char* pc = (char*)&a;
int* pi = &a;
printf("%p\n", &a);
printf("%p\n", pc);
printf("%p\n", pc + 1);
printf("%p\n", pi);
printf("%p\n", pi + 1);
return 0;
}
输出结果
指针的类型决定了指针向前或者向后走一步有多大(距离)
指针的解引用
演示代码
#include <stdio.h>
int main()
{
int n = 0x11223344;
char* pc = (char*)&n;
int* pi = &n;
*pc = 0;
*pi = 0;
return 0;
}
输出结果
指针的类型决定指针解引用的时候能操作几个字节
如 char* 的指针解引用就只能访问一个字节, int* 的指针的解引用就能访问四个字节。
三、野指针
1.什么是野指针
在C语言中,野指针是指指向未知或无效内存地址的指针。当指针指向的内存地址没有被初始化或者已被释放时,这个指针就是野指针。野指针可能会导致程序崩溃、出现不可预期的结果或者安全漏洞。因此,在使用指针时需要避免野指针的出现。
2.野指针成因
野指针成因分为以下三类:
1.指针在使用前未初始化
#include <stdio.h>
int main()
{
int *p;//指针变量未初始化,默认为随机值
*p = 10;
return 0;
}
2.指针越界访问
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
3.指针指向的空间释放
这里是基础篇的介绍,会放到指针进阶篇中进行介绍
3.如何避免野指针
野指针的出现主要是因为程序员使用未初始化的指针、已经被释放的指针或者指针越界等错误操作所造成的
为了避免野指针的出现,可以采取以下措施:
- 初始化指针变量。指针变量在定义时应该进行初始化,防止指针变量不确定性。
- 使用NULL指针。当指针没有指向任何变量时,应该将指针赋值为NULL,防止野指针出现。
- 尽量使用动态内存分配。使用动态内存分配函数(如 malloc、calloc 等)时,要注意分配的内存大小,以及使用后释放内存。
- 避免指针越界。指针越界会破坏内存结构,导致野指针的出现。要保证指针在有效的内存范围内操作。
- 及时释放指针。在指针不再使用时,及时释放指针,避免野指针的出现。
- 使用静态分析工具进行代码检查,检查指针是否未初始化或者使用后未释放。
四、总结
本篇对指针、指针类型和野指针进行了介绍,在C语言使用指针时要避免野指针的出现。
文章重点内容:
- 指针的大小在 32 位平台是 4 个字节,在 64 位平台是 8 个字节
- 指针的类型决定了指针向前或者向后走一步有多大(距离)
- 指针的类型决定指针解引用的时候能操作几个字节
- 使用未初始化的指针、已经被释放的指针或者指针越界会造成野指针
如这篇博客对大家有帮助的话,希望 三连 支持一下 !!! 如果有错误感谢大佬的斧正 如有 其他见解发到评论区,一起学习 一起进步。