> 文档中心 > C语言自学之路十三(详解C语言初阶指针)

C语言自学之路十三(详解C语言初阶指针)


本文所结合图书及视频

《C语言程序设计(第四版)谭浩强.pdf》
《C语言入门到精通—鹏哥带你C语言入门到精通》
《郝斌老师的C语言自学视频》
这些在B站上都能找得到的。

学习目标:

对C语言的指针有个全面的了解,会使用简单的指针。

章节内容:

1. 指针是什么
2. 指针和指针类型
3. 什么是野指针
4. 指针运算
5. 指针和数组
6. 二级指针
7. 指针数组

一 、指针是什么
 在计算机科学中,指针(pointer)是编程语言中的一个对象,利用地址,它的值直接指向 存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指 向该变量单元。因此,将地址形象化的称为“指针”。 意思是通过它能找到以它为地址的内存单元。`指针就是地址,地址就是指针`

指针
指针是个变量,存放内存单元的地址(编号)。
举例:

# include int main(void){int a = 10; //在内存中开辟一块空间int *p = &a; //这里我们用&(取地址符)可以取出a的地址 //将a地址存放在P变量中,P就是一个指针变量。return 0}

总结: 指针就是变量,用来存放地址的变量(存放在指针中的值都被当成地址处理)
指针的大小在32位平台是4个字节,在64位平台是8个字节

二、指针和指针类型

指针类型

指针的定义方式为: type + * 其实,指针类型的不同所访问的权限也是不同的。
举例:

# include int main(void){int a = 0x11223344int* pa = &a;*pa = 0;// 访问权限为4个字节char* pc = &a;*pc = 0;// 访问权限为1个字节return 0;}

上述代码可通过监视内存对比如下:
int * 类型改值前后对比
在这里插入图片描述
访问权限为4个字节 在这里插入图片描述
char* 类型改值前后对比
在这里插入图片描述
访问权限为1个字节
在这里插入图片描述
通过上面简单的对比,我们知道指针类型决定了指针解引用的权限有多大。我们再来看下面这个例子:
在这里插入图片描述这个示例我们可以看出来,整型指针走一步为4个字节,字符型指针走一步为1个字节,也就是说指针类型决定了指针走一步,能走多远,也就是步长。

总结
1、指针类型决定了指针解引用时的权限有多大。
2、指针类型决定了指针移动时的步长。

三、野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

野指针的成因:
1、指针未初始化
举例: 指针变量未初始化,默认是随机值。改值属于非法访问在这里插入图片描述
2、指针越界访问
举例:
当指针指向的范围超出数组arr的范围时,指针访问越界,就是野指针。
在这里插入图片描述
3、指针指向的空间释放
举例:
在这里插入图片描述这个例子第一次输出C语言123456,第二次输出的是乱码或者什么也不输出。这是因为,free() 只是释放掉了动态分配的内存,但并未改变 str 的值,str 的值不是 NULL,它仍然指向被释放掉的内存,所以会执行 if 语句里面的 puts() 函数。但由于此时的内存已经被释放掉了,原来的字符串已经不在了,所以输出的数据是未知的。
4、函数外部指针指向函数内部的变量、数组等
举例:
在这里插入图片描述arr 数组在栈上分配内存,字符串"C语言"就存储在这里,func() 函数运行结束后,这块内存被释放掉,但是函数外部的 pstr 仍然指向这里,所以执行puts(pstr);时,输出结果是未知的。
如何规避野指针

  1. 指针初始化 (如果不知道要指向哪里,可以先赋值NULL)
  2. 小心指针越界
  3. 指针指向空间释放及时置空(NULL)
  4. 指针使用之前先检查有效性
四、指针运算

指针加减整数
在这里插入图片描述
指针加减整数的结果取决于指针的类型

指针减指针
C语言自学之路十三(详解C语言初阶指针)指针减指针必须在同一块空间内,相减得到的是两个指针之间的元素个数。

指针的关系运算
在这里插入图片描述当对指针变量进行比较运算时,比较的是指针变量本身的值,也就是数据的地址。如果地址相等,那么两个指针就指向同一份数据,否则就指向不同的数据。注意
不能对指针变量进行乘法、除法、取余等其他运算,除了会发生语法错误,也没有实际的含义。
指针与指针比较的时候,标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置相比较,但是不允许指向数组最后一个元素的指针与数组第一个元素前面的那个内存位置相比较。

五、指针和数组

数组名
数组名表示数组首元素的地址。数组名可以当成地址存放到一个指针中,以便于我们使用指针来访问数组。反正都是地址,用指针和数组名访问得到的地址肯定是一样的!
举例:
在这里插入图片描述

六、二级指针

存放指针变量的地址的变量,就是二级指针。
举例:
在这里插入图片描述

七、指针数组

指针数组
指针数组到底是指针?还是数组呢?
指针数组就是数组,但是它存放的都是指针变量。
在这里插入图片描述            好了,通过这篇文章的内容,我们学习了C语言的初阶指针,对指针、指针类型、野指针、指针运算、指针和数组、二级指针、指针数组都有了一定的了解,下期我继续讲解C语言的初阶结构体内容。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述