C语言笔记初级篇第六章:指针入门

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言笔记初级篇第六章:指针入门相关的知识,希望对你有一定的参考价值。

目录

(1)指针是什么

(2)指针和指针类型

A:指针类型

B:指针类型的意义

(3)野指针

A:什么是野指针

B:野指针的起因

C:如何避免野指针

(4)指针运算

A:指针+-整数

B:指针-指针

C:指针的关系运算

(5)指针与数组

(6)二级指针


(1)指针是什么

第一:官方定义

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

第二:基本用法

第三:总结

总的来说:指针就是变量,而它是用来专门存放内存地址的变量指针的大小在32位平台是4个字节,在64位平台是8个字节。

(2)指针和指针类型

A:指针类型

要保存相应类型变量的地址就要定义相应类型的指针

B:指针类型的意义

第一:看似无意义?

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

第二:实例说明

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

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

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

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

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

(3)野指针

A:什么是野指针

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

B:野指针的起因

第一:指针没有初始化

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

第二:指针越界访问

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

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

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

C:如何避免野指针

1:指针初始化

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

 

2:小心指针越界

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

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

(4)指针运算

A:指针+-整数

可以用来访问数组

B:指针-指针

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

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

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

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

C:指针的关系运算

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

 

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

 

(5)指针与数组

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

(6)二级指针

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

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

以上是关于C语言笔记初级篇第六章:指针入门的主要内容,如果未能解决你的问题,请参考以下文章

c++c++面试知识6——第六章 语言特性相关

C语言数据结构(大话数据结构——笔记4)第六章:树

Java编程基础篇第六章

C++ Primer Plus学习:第六章

阅读笔记《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)

C和指针 (pointers on C)——第六章:指针(上)