1.二级指针

目录

1.概念

2.举一反三(习题)

3.二级指针与数组


1.概念

  • 指针可以指向普通类型的数据,例如 int,double,char等,也可以指向指针类型的数据,例如 int*,double*,char*等。如果一个指针指向的是另一个指针,我们就称它为二级指针,或者指向指针的指针。
  • 二级指针存放的是一级指针的地址,一级指针存放的是变量的地址,变量存放的是数值。
  • 只要是指针,均占4个字节

2.举一反三(习题)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbTBfNTc3ODc1MDI=,size_20,color_FFFFFF,t_70,g_se,x_16

(1)int类型

s+1:s是二级指针,存放的是p0的地址。s+1后存放的是p1的地址,相当于加了4个字节(指针),加后的结果为int**。

*s+1:*s为p0本身,p0是一级指针,存放的是a0的地址,则*s+1为a1的地址,相当于加了4个字节(int类型),加后结果为int*。

**s+1:**s为a0本身,**s+1相当于a0的值加1,则**s+1的值为1,加后结果为int。

(2)double类型

s+1:s是二级指针,存放的是p0的地址。s+1后存放的是p1的地址,相当于加了4个字节(指针),加后的结果为double**。

*s+1:*s为p0本身,p0是一级指针,存放的是a0的地址,则*s+1为a1的地址,相当于加了8个字节(double类型),加后结果为double*。

**s+1:**s为a0本身,**s+1相当于a0的值加1,则**s+1的值为1,加后结果为double。

(3)char类型

s+1:s是二级指针,存放的是p0的地址。s+1后存放的是p1的地址,相当于加了4个字节(指针),加后的结果为char**。

*s+1:*s为p0本身,p0是一级指针,存放的是a0的地址,则*s+1为a1的地址,相当于加了1个字节(char类型),加后结果为char*。

**s+1:**s为a0本身,**s+1相当于a0的值加1,则**s+1的值为1,加后结果为char。

3.二级指针与数组

  •  数组名被看作该数组的第一个元素在内存中的首地址(仅在sizeof操作中例外,该操作给出数组所占内存大小)。数组名在表达式中被自动转换为一个指向数组第一个元素的指针常量。
  •  数组名是指针,非常方便,但是却丢失了数组另一个要素:数组的大小,即数组元素的数量。编译器按数组定义时的大小分配内存,但运行时对数组的边界不加检测。这会带来无法预知的严重错误。
  • C提供根据数组的存储地址访问数组元素的方法。上图中ar是数组第一个元素的地址,所以*ar是数组的第一个元素ar[0],而ar+l是数组第二个元素的地址,*(ar+1)是第二个元素ar[1]本身。指针加1,则地址移动一个数组元素所占字节数。
  • C语言的下标运算符[]是以指针作为操作数的,ar[i]被编译系统解释为*(ar+i),即表示为ar所指(固定不可变)元素向后第i个元素。无论以下标方式或指针方式存取数组元素时,系统都是转换为指针方法实现。逻辑上有两种方式,物理上只有一种方式。
  • 若定义int ar[4];ar代表整个数组ar首元素地址,&ar代表整个数组的首地址。则ar+1代表加到数组第二个元素ar [1] 的地址,&ar+1代表加到下一个数组首地址。ar和&ar的值相同,但意义不同。

如图:定义int (*s)[4];int ar0[4],ar1[4],ar2[4], s=&ar0, 如何给ar2[3]赋值为100?

解析:*(s+2)表示数组ar2首元素的地址(没有*是数组的地址),*(s+2)+3表示数组 ar2[3]的地址,*(*(s+2)+3)表示数组 ar2[3]元素本身,则有*(*(s+2)+3)=ar2[3]=100。

将指针转换为数组下标:*(s+2)=s[2],则原式转换伟*(s[2]+3),进一步转化为s[2][3]。则赋值可以表示为s[2][3]=100;

       

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值