c语言-指针
前言
本篇文章叙述了c语言中的一个非常重要的知识点,指针。指针作为学习c语言的重点和难点,掌握指针的用法是必要的。
一、指针
在介绍指针之前,首先介绍计算机的内存单元。
计算机将内存划分为一个个内存单元,每个内存单元的大小为1个字节。
为了找到每个内存单元,每个内存单元会有一个地址。通过地址可以对内存单元进行操作。
地址由计算机的地址线通过产生高低电平的电信号产生。
对于32位机器,地址线有32根,地址占32位,即4个字节
对于64位机器,地址线有64根,地址占64位,即8个字节。
可以把地址和内存单元的对应关系想象成如图1.1
1.1 什么是指针?
指针就是地址
而在c语言学习中,习惯将指针变量称作指针。指针变量是存放地址的变量。比如
int a = 10; //表示一个整型变量a存放一个整型值
int *pa = &a; //表示一个整型指针变量pa存放一个整型变量a的地址
上面两个变量在内存中的表示如下(32位机器为例)
整型变量a存储的是整型值10,int型占4个字节。
指针变量pa存储的是整型变量a的地址,地址在32位机器占4个字节。
1.2 指针变量的大小
在32位机器中,指针变量的大小都是4个字节
在64位机器中,指针变量的大小都是8个字节
1.3 指针类型的意义
- 指针类型决定了指针被解引用时,访问指针所指向空间的字节数
当执行下面代码并查看在内存中的存储方式
执行int a = 0x11223344
后,内存的表示情况如下
当把a的地址赋值个一个整型指针变量,并通过对指针变量进行解引用时,执行*p = 0
后,
当把整型指针变量的类型变成字符型指针变量时,下图所示
- 指针类型决定了指针向前或向后走一步跳过多少个字节
分析下面的代码和执行后产生的结果
分析:
当整型指针变量pi+1时,pi+1的地址是在pi的基础上加了四个字节;
当字符型指针变量pc+1时,pc+1的地址是在pc的基础上加了一个字节;
说明指针类型影响了指针向前走时,跳过了几个字节。具体如图1.9所示:
注意:int*
和float*
不可以通用,虽然解引用时访问的字节数都是四个字节,但是int型数据和float数据的存储方式不一样。
二、野指针
2.1 野指针的成因
- 指针未进行初始化
例子,下面的代码就是指针未进行初始化
int main()
{
int* pa; //指针未进行初始化,pa存的是随机值
*pa = 10; //操作随机地址,属于非法范围
return 0;
}
- 指针越界访问
指针越界访问是指使用指针访问数组元素时,指针指向了数组外的空间并且访问这块空间,就会造成指针访问越界
int main()
{
int arr[5] = {0};
int* pa = arr; //arr相当于&arr[0]
int i = 0;
for(i = 0;i <= 5;i++)
{
*(pa + i) = i;
}
return 0;
}
当i = 5时,*(pa+5) = 5相对于arr[5] = 5,造成指针越界访问。
- 指针指向的空间被释放
int* test()
{
int a = 10;
return (&a);
}
int main()
{
int* pa = test();
*pa = 5; //指针访问了被释放的空间
return 0;
}
当test()函数被调用完成时,局部变量a的空间会被释放,不属于当前程序,返回的地址不属于这个程序,当操作这个被释放的空间时,属于非法访问。
2.2 避免野指针的方法
- 指针初始化,如果使用前不清楚指针的指向,可置NULL
- 小心指针越界访问
- 指针指向被释放的空间及时置NULL
- 避免返回局部变量的地址
- 指针使用之前先检查指针的有效性
总结
本篇文章介绍了c语言的指针部分知识点,包括指针的含义,指针类型的意义,野指针以及如何避免野指针。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!