深入理解指针(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中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,
单位是字节
&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素
的地址是有区别的)
除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值