c语言指针知识点讲解 (c语言定义一个指向指针的指针)

第六章:指针

(1)指针是什么

第一:官方定义

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

第二:基本用法

c语言指针系列大全,c语言指针最容易明白的详解

第三:总结

总的来说:指针就是变量,而它是用来专门存放内存地址的变量

指针的大小在32位平台是4个字节,在64位平台是8个字节。

(2)指针和指针类型

A:指针类型

众所周知,要保存相应类型变量的地址就要定义相应类型的指针

c语言指针系列大全,c语言指针最容易明白的详解

B:指针类型的意义

第一:看似无意义?

如下,对于一个整形变量,使用int* 指针和char*指针都能正确保存其内容,那么区分这么多类型是否就没有意义呢

c语言指针系列大全,c语言指针最容易明白的详解

第二:实例说明

c语言指针系列大全,c语言指针最容易明白的详解

c语言指针系列大全,c语言指针最容易明白的详解

c语言指针系列大全,c语言指针最容易明白的详解

于是我们可以得知,指针类型决定了指针进行解引用操作时,能够访问的空间大小。比如char* 只能访问1个字节,于是他指针修改int的一部分。

如下,指针的类型决定了指针向前向后走一步能有多大距离(这个距离就是字节)

c语言指针系列大全,c语言指针最容易明白的详解

第三:指针与数组的关系的再说明

前面说过,数组名其实就是数组首元素的地址。所以数组名就直接可以赋值给指针。下面的数组中有10个元素,为int型数组,每一个元素4个字节,数组长40个字节。用指针可以将他们的元素全部变为1。为了验证上面的说法,先定义int*的指针去操作

c语言指针系列大全,c语言指针最容易明白的详解

接着我们定义char*指针去操作int数组,看下是否和前面说的char*指针解引用时只能移动一个字节,同时这次我们用内存窗口观察

c语言指针系列大全,c语言指针最容易明白的详解

c语言指针系列大全,c语言指针最容易明白的详解

(3)野指针

A:什么是野指针

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

B:野指针的起因

第一:指针没有初始化

局部变量没有初始化,会被设为默认值,但是指针没有初始化会是一个随机值

c语言指针系列大全,c语言指针最容易明白的详解

第二:指针越界访问

上面数组和指针实例中,指针不能一直加到数组范围之外,否则就成了一个野指针了

c语言指针系列大全,c语言指针最容易明白的详解

第三:指针指向的空间释放

这一点在动态内存中会讲到,下面的代码运行结果正确,但是本质是错误的

c语言指针系列大全,c语言指针最容易明白的详解

C:如何避免野指针

1:指针初始化

指针在创建时,尽量初始化,让其指向某一片地址。如果实在不知道指向什么,可以设置为空指针

c语言指针系列大全,c语言指针最容易明白的详解

2:小心指针越界

3:释放指针指向的空间时,及时将指针置为NULL

4:使用指针之前坚持其有效性

(4)指针运算

A:指针+-整数

可以用来访问数组

c语言指针系列大全,c语言指针最容易明白的详解

B:指针-指针

指针变量p1减p2的意义为:

如果是正值 , 则表示在内存中p1比p2靠后

如果是负值 , 则表示 在内存中 p1比p2靠前

结果的数字表示 , 两个地址在内存中间隔多少个指针类型的字节倍数

c语言指针系列大全,c语言指针最容易明白的详解

通过这样一点,我们可以由此写出自定义求字符串长度的第三种方式

c语言指针系列大全,c语言指针最容易明白的详解

C:指针的关系运算

c语言指针系列大全,c语言指针最容易明白的详解

上述写法是标准写法,当然从运行角度上讲也可以写成下面这样

c语言指针系列大全,c语言指针最容易明白的详解

从可读性上讲很好,但是这样会导致最终比较时比较到数组前面去了,而C语言规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较

c语言指针系列大全,c语言指针最容易明白的详解

(5)指针与数组

指针与数组的基本关系前面已经叙述得很多了。这里主要说几个案例

c语言指针系列大全,c语言指针最容易明白的详解

c语言指针系列大全,c语言指针最容易明白的详解

(6)二级指针

如下,p指针保存a变量的地址,pp指针保存p指针的地址。pp指针解引用的内容就是a的地址。

c语言指针系列大全,c语言指针最容易明白的详解

当然所涉及的操作依然是相似的

c语言指针系列大全,c语言指针最容易明白的详解

(7)指针数组

指针数组,又或是数组指针,这是C语言中经常混淆的一个概念。细细品味其实不难分辨,整形数组是存放整形数据的,字符数组是存放字符的,那么指针数组自然而然就是存放指针的

c语言指针系列大全,c语言指针最容易明白的详解