问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

深入理解C语言指针:从基础概念到高级应用

创作时间:
作者:
@小白创作中心

深入理解C语言指针:从基础概念到高级应用

引用
CSDN
1.
https://blog.csdn.net/Whisper_long/article/details/138122494

指针是C语言中一个非常重要且强大的概念,它允许程序员直接操作内存地址,从而实现更灵活和高效的编程。本文将从指针的基本概念出发,详细讲解指针的类型、地址操作符、解引用操作符、二级指针以及数组名的使用等多个方面,帮助读者全面理解C语言中的指针。

指针(Pointer)

指针变量和地址

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。

指针的类型

得知指针的类型其实很简单,只要把指针变量名去掉,剩下的就是指针的类型。

例如:

(1)char * p的类型为char*;

(2)int * p的类型为int*;

(3)int * * p的类型为int**;

(4)int*(* p)[3]的类型为int*(*)[3];

(5)int (*p)[4]的类型为int( * )[4];

指针所指向的类型

你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:

(1)char * ptr; //指针所指向的的类型是char

(2)int * ptr; //指针所指向的类型是int

(3)int**ptr; //指针所指向的的类型是int *

(4)int( * ptr)[3]; //指针所指向的的类型是int()[3]

指针变量和取地址符(&)

在C语⾔中创建变量其实就是向内存申请空间,⽐如:

上述的代码就是创建了整型变量a,内存中申请4个字节,⽤于存放整数10,其中每个字节都有地址。

那我们如何能得到a的地址呢?

这⾥就得学习⼀个操作符(&)-取地址操作符

&a取出的是a所占4个字节中地址较⼩的字节的地址。虽然整型变量占⽤4个字节,我们只要知道了第⼀个字节地址,顺藤摸⽠访问到4个字节的数据也是可⾏的。

指针变量和解引用操作符(*)

指针变量

我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如:0x006FFD70,这个数值有时候也是需要存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。

指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。

解引用操作符

我们将地址保存起来,未来是要使⽤的,那怎么使⽤呢?

在现实⽣活中,我们使⽤地址要找到⼀个房间,在房间⾥可以拿去或者存放物品。

C语⾔中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,这⾥必须学习⼀个操作符叫解引⽤操作符(*)。

上⾯代码中第7⾏就使⽤了解引⽤操作符, *pa 的意思就是通过pa中存放的地址,找到指向的空间,

pa其实就是a变量了;所以pa = 10,这个操作符是把a改成了10.有同学肯定在想,这⾥如果⽬的就是把a改成0的话,写成 a = 0; 不就完了,为啥⾮要使⽤指针呢?

其实这⾥是把a的修改交给了pa来操作,这样对a的修改,就多了⼀种的途径,写代码就会更加灵活,

二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?

这就是 ⼆级指针 。

对于⼆级指针的运算有:

*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa .即:*ppa = &b等价于 pa = &b;

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作:pa ,那找到的是 a 。

即:**ppa = 30;

//等价于pa = 30;

//等价于a = 30;

数组名的理解

节我们在使⽤指针访问数组的内容时,有这样的代码:

我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样,数组名就是数组⾸元素(第⼀个元素)的地址。

这时候有同学会有疑问?数组名如果是数组⾸元素的地址,那下⾯的代码怎么理解呢?

输出的结果是:40,如果arr是数组⾸元素的地址,那输出应该的应该是4才对。其实数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:

sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,

单位是字节

&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素

的地址是有区别的)

除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号