前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c语言进阶指南(9)(指针与指针类型)

c语言进阶指南(9)(指针与指针类型)

原创
作者头像
代码小豪
发布2024-06-10 11:40:02
920
发布2024-06-10 11:40:02
举报
文章被收录于专栏:C语言程序指南

*欢迎来到博主的专栏——C语言进阶指南

博主id:reverie_ly*

@toc

指针

计算机中的内存的最小单位是比特(bit),每一个比特位都是一个二进制数。现代的计算机大多将八个比特位划分为一个字节(byte)。

系统会为内存中的每个字节划分一个地址。32位机的地址是32位的,64位机上的地址是64位的。

以32为例。每个字节的地址如下

以此类推,每个字节都有自己的地址,系统可以根据这些地址访问数据。

指针的定义

指针本质上是一个变量,这个变量的值是用来存储地址。虽然其他变量也能存储地址值相同的数,但是地址的取值范围和一般的变量取值范围不一样。所以C语言用一个专用来存储地址值的类型的变量,称为指针变量。

指针的声明

指针变量的声明与普通变量的声明类似,只是变量类型不同。这些变量的类型是由存储的地址的变量来决定的

代码语言:c
复制
char c;
int i;
long l;
float f;
double d;

char *pc=&c;
int *pi=&i;
long*pl=&l;
float* f=&f;
double* d=&d;

指针的类型需要和存储地址变量一致才能完整的对该地址的数据进行操作(后面会介绍不一致时会导致的事情)

指针的初始化

如果指针只声明不初始化,指针会指向一个随机的区域

代码语言:c
复制
int *pi;//pi存储的地址是一个随机值。

这种声明是合法的,在程序中对其进行指针操作也是合法的,但是运行后轻则程序崩溃,重则造成系统崩溃。

指针的初始化有以下方法

1)给指针初始化一个明确的地址值

代码语言:c
复制
int i;
int *pi=&i;//i的地址

“&”是取地址操作符,可以得到操作数的地址

2)给指针赋予一个没有意义的地址

代码语言:c
复制
int *pi=NULL;//NULL的值是0,但是地址的最小值都是从1开始的

野指针

指针指向的是系统中的地址,所以对这些没有初始化的指针(随机地址)进行数据修改是一个很危险的事(特别是对操作系统的数据进行修改)。这种指针被称为野指针

虽然在vs中引用了这种随机的指针会报错,不会对计算机造成实质上的伤害,但是还是要注意。

野指针可以分类成一下几种。

1)未初始化指针

2)指针指向地址不合法

代码语言:c
复制
int a=1;
int *pi=a;

这里pi指向的地址是1的地址,这个地址不合法,轻则……(你懂的--+)。

那么什么是合法区域呢?那就是系统给你程序中划分了的空间就是合法的,系统没有给这个空间的访问权限,使用指针进行操作就是非法的。

3)访问权限被收回的指针。

注意下面的代码

代码语言:c
复制
int *point(){
     int a;
     int *pa=&a;
     return  *pa;
}
int main()
{
     int*pi=point();
}

我们不能说这个pi没有初始化,也不能说给pi赋予了一个很离谱的地址值,但是这个pi指向的空间就是不合法

这是由于变量a声明在函数的内部,是存储在栈区上的。当这个函数结束时,a变量所在的空间会被销毁。

但是地址又被返回到了pi上。所以pi指向的空间是被销毁的a变量的空间。这个空间已经被系统销毁了、所以是不合法的地址访问。(权限被系统收回)。

如何有效避免野指针

1)要注意给指针初始化一个有意义的值

代码语言:c
复制
int i;
int*pi=&i;

2)注意指针的空间在访问时是否依然合法。

3)如果不知道空间的访问权限何时被收回。那么在指针的使用之后置为空指针也是不错的选择

代码语言:c
复制
int i;
int*pi=&i;
*pi=5;//对指针进行操作
*pi=NULL;//操作结束就置为空指针

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 指针
    • 指针的定义
      • 指针的声明
        • 指针的初始化
          • 野指针
            • 如何有效避免野指针
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档