C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C语言指针基础

C语言指针基础详解

作者:RookieStriver

这篇文章主要介绍了C语言指针的基础,主要对C语言中指针的本质及常见用法做了较为通俗易懂的分析,是后续深入学习C语言的基础,需要的朋友可以参考下

1.1:概述

1.1.1:内存

内存含义:

1.1.2:内存

内存地址:

1.1.3:指针和指针变量

1.2:指针基础知识

1.2.1:指针变量的定义和使用

- 指针是一种数据类型,指针变量是一种存放地址编号的变量。

-‘*' 解引用操作符,表示指针所指的内存空间的具体内容。

打印变量的地址:(用%p)

在这里插入图片描述

解引用操作符的运用:

在这里插入图片描述

int * 代表了指针类型,p是定义的指针类型的变量,将a的地址赋给变量P,这是p中存的是a的地址编号,p就指向了a的空间,*P就表示a空间里的内容,也就是a的值。

1.2.2:通过指针间接修改变量的值

前面我们提到了关于由const修饰的局部变量的修改,不可以通过赋值直接修改,这里我们介绍通过指针间接的修改变量的值。

在这里插入图片描述

当直接修改由const修饰的常量时,我们可以看出会发生错误。

在这里插入图片描述

这时我们定义一个指针变量间接的修改局部变量的值是可以的!我们用个图来辅助理解:

在这里插入图片描述

1.2.3:指针的大小

1.2.4:空指针与野指针

①:任意数值赋值给野指针。

②:操作野指针指向的内存区域。

在这里插入图片描述

1.2.4:万能指针

这里我们不做详细的介绍,void * 指针可以指向任意变量的内存空间:

在这里插入图片描述

特别注意:我们在对万能指针进行操作时,因为系统需要知道具体需要对几个字节的内容进行操作,所以我们需要强转成具体的指针类型。

1.2.5:const修饰的指针变量

const修饰指针变量时,因const的位置不同,修饰的意义也有所不同,如下代码:

在这里插入图片描述

对于p1 ,const可以理解为修饰的*p1,也就是修饰的空间的内容,这时这块空间的地址是可以重新赋值的,而内容不可以!

对于p2,const修饰的是指针变量p2,也就是修饰的空间地址,所以这时可以对内容进行辅助,而不可以改变变量的地址!

注:在编写程序时,指针作为函数参数传递,如果对应的内存空间的值不会被修改,可以使用const修饰指针数据类型。

1.3:指针与数组

1.3.1:数组名

敲重点:对一维数组来说,数组名是首元素地址,是一个常量!!,不可以修改,切记切记,对二维数组来说,此时数组名也是首元素地址,只不过此时的首元素不再只是一个元素,而是一个一维数组。

1.3.2:指针操作数组

其实博主觉得,用指针操作数组可读性还是比较差,而且后续面对多维数组,用指针来操作数组比较麻烦,可读性差。无奈博主学艺不精呀。

在这里插入图片描述

这里*(arr + i) 与arr[i]的效果一摸一样,这里的知识点涉及到指针的加减运算,见下一小节。

1.3.3:指针的加减运算

(1) 加法运算

指针计算绝对不是简单的整数相加,这里与指针类型有关:

在这里插入图片描述

此时数组名是首元素1的地址,属于整型指针,+2表示变化2个int的大小,也就是第三个元素的地址。

(2) 减法运算

这里对于指针减一个整数的作用与加法如出一辙,也是与指针类型有关。

在这里插入图片描述

这里我们利用一个逆序打印数组来说明指针减法,特别注意 arr与&arr分别+1的区别,arr表示的是首元素地址,&arr表示的是整个数组的地址,arr + 1变化4字节,而&arr + 1 变化的是整个数组大小的字节数(36)。如图:

在这里插入图片描述

在这里插入图片描述

我们可以看出,打印&arr与arr的地址编号是一样的,但是意义是不一样的。 1.3.4:指针数组

指针数组还是一个数组,数组元素都是指针类型,拿一级指针数组举例:

在这里插入图片描述

这里博主提一点自己对一级指针数组的理解,希望对大家有一丢丢帮助,一级指针数组我把它与二级指针、二维数组相对应,这里不做详细解释,后续指针强化我会解释我的理解,这种理解可能按官方说法来说不严谨,但是能帮助我们理解就好。

1.4:指针基础小结

1.5:总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

您可能感兴趣的文章:
阅读全文