c语言-指针

发布时间:2023年12月25日


前言

本篇文章叙述了c语言中的一个非常重要的知识点,指针。指针作为学习c语言的重点和难点,掌握指针的用法是必要的。


一、指针

在介绍指针之前,首先介绍计算机的内存单元。
计算机将内存划分为一个个内存单元,每个内存单元的大小为1个字节。
为了找到每个内存单元,每个内存单元会有一个地址。通过地址可以对内存单元进行操作。
地址由计算机的地址线通过产生高低电平的电信号产生。
对于32位机器,地址线有32根,地址占32位,即4个字节
对于64位机器,地址线有64根,地址占64位,即8个字节。
可以把地址和内存单元的对应关系想象成如图1.1
在这里插入图片描述

图1.1 地址-内存单元对应图

1.1 什么是指针?

指针就是地址
而在c语言学习中,习惯将指针变量称作指针。指针变量是存放地址的变量。比如

int a = 10; //表示一个整型变量a存放一个整型值
int *pa = &a; //表示一个整型指针变量pa存放一个整型变量a的地址

上面两个变量在内存中的表示如下(32位机器为例)
在这里插入图片描述

图1.2 变量存储

整型变量a存储的是整型值10,int型占4个字节。
指针变量pa存储的是整型变量a的地址,地址在32位机器占4个字节。

1.2 指针变量的大小

在32位机器中,指针变量的大小都是4个字节
在这里插入图片描述

图1.3 32位机器指针变量的大小

在64位机器中,指针变量的大小都是8个字节
在这里插入图片描述

图1.4 64位机器指针变量的大小

1.3 指针类型的意义

  1. 指针类型决定了指针被解引用时,访问指针所指向空间的字节数
    当执行下面代码并查看在内存中的存储方式
    执行int a = 0x11223344后,内存的表示情况如下
    在这里插入图片描述
图1.5 int a = 0x11223344内存表示图

当把a的地址赋值个一个整型指针变量,并通过对指针变量进行解引用时,执行*p = 0后,
在这里插入图片描述

图1.6 *pa = 0 内存表示图
分析: 通过对比图1.5和图1.6可知,当执行了*pa = 0,由于int占四个字节,解引用可以访问四个字节,所以整型变量a的四个字节都变成了0。

当把整型指针变量的类型变成字符型指针变量时,下图所示
在这里插入图片描述

图1.7 * pa = 0内存表示图
分析: 通过图1.7可知,当执行了*pa = 0,由于char只占一个字节,解引用只能访问一个字节,所以只能把一个字节变成0。
  1. 指针类型决定了指针向前或向后走一步跳过多少个字节

分析下面的代码和执行后产生的结果
在这里插入图片描述

图1.8 指针类型意义2

分析:
当整型指针变量pi+1时,pi+1的地址是在pi的基础上加了四个字节;
当字符型指针变量pc+1时,pc+1的地址是在pc的基础上加了一个字节;
说明指针类型影响了指针向前走时,跳过了几个字节。具体如图1.9所示:
在这里插入图片描述

图1.9

注意int*float*不可以通用,虽然解引用时访问的字节数都是四个字节,但是int型数据和float数据的存储方式不一样。

二、野指针

2.1 野指针的成因

  1. 指针未进行初始化
    例子,下面的代码就是指针未进行初始化
int main()
{
int* pa;  //指针未进行初始化,pa存的是随机值
*pa = 10; //操作随机地址,属于非法范围
return 0;
}
  1. 指针越界访问
    指针越界访问是指使用指针访问数组元素时,指针指向了数组外的空间并且访问这块空间,就会造成指针访问越界
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,造成指针越界访问。

  1. 指针指向的空间被释放
int* test()
{
int a = 10;
return (&a);
}

int main()
{
int* pa = test();
*pa = 5;   //指针访问了被释放的空间
return 0;
}

当test()函数被调用完成时,局部变量a的空间会被释放,不属于当前程序,返回的地址不属于这个程序,当操作这个被释放的空间时,属于非法访问。

2.2 避免野指针的方法

  1. 指针初始化,如果使用前不清楚指针的指向,可置NULL
  2. 小心指针越界访问
  3. 指针指向被释放的空间及时置NULL
  4. 避免返回局部变量的地址
  5. 指针使用之前先检查指针的有效性

总结

本篇文章介绍了c语言的指针部分知识点,包括指针的含义,指针类型的意义,野指针以及如何避免野指针。

文章来源:https://blog.csdn.net/pyc68/article/details/135181228
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。