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

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

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

博主id:reverie_ly*

@toc

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

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

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

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

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

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

代码语言:c代码运行次数:0运行复制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代码运行次数:0运行复制int *pi;//pi存储的地址是一个随机值。这种声明是合法的,在程序中对其进行指针操作也是合法的,但是运行后轻则程序崩溃,重则造成系统崩溃。

指针的初始化有以下方法

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

代码语言:c代码运行次数:0运行复制int i;

int *pi=&i;//i的地址“&”是取地址操作符,可以得到操作数的地址

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

代码语言:c代码运行次数:0运行复制int *pi=NULL;//NULL的值是0,但是地址的最小值都是从1开始的野指针指针指向的是系统中的地址,所以对这些没有初始化的指针(随机地址)进行数据修改是一个很危险的事(特别是对操作系统的数据进行修改)。这种指针被称为野指针

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

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

1)未初始化指针

2)指针指向地址不合法

代码语言:c代码运行次数:0运行复制int a=1;

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

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

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

注意下面的代码

代码语言:c代码运行次数:0运行复制int *point(){

int a;

int *pa=&a;

return *pa;

}

int main()

{

int*pi=point();

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

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

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

如何有效避免野指针1)要注意给指针初始化一个有意义的值

代码语言:c代码运行次数:0运行复制int i;

int*pi=&i;2)注意指针的空间在访问时是否依然合法。

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

代码语言:c代码运行次数:0运行复制int i;

int*pi=&i;

*pi=5;//对指针进行操作

*pi=NULL;//操作结束就置为空指针

💫 相关推荐

Android 上的应用程序存储在哪里以及如何轻松访问应用程序文件?
怎么看网络下架圣经一事?
365bet365备用网站

怎么看网络下架圣经一事?

📅 07-08 👁️ 6998
大闸蟹要蒸多长时间合适(大闸蟹怎么蒸?蒸多久?哪些部位不能吃?看看你做对没有)