c语言学习笔记(二级指针)

一级指针变量可以指向(存储)变量的地址,例如 int * ip , double * dp等

一级指针也是变量,如果要存储一级指针变量地址,就定义二级指针变量,二级指针变量就是存储一级指针变量地址。

int main()
{
	int a = 10, b = 20;
	int* p1 = &a;
	int* p2 = NULL;
	int** s = &p1; // 二级指针,存放的是p1的地址,而p1也是指针,存放的是a的地址
    *s = &a;
    **s = 100; // 实际上改变的是a本身
}

s存放的是p1的地址,*s就是p1本身,p1存放的是a的地址,*p1就是a本身,因此**s就是a本身

二级指针++ 的情况

s + 1  加4字节,因为s是二级指针,s + 1 是从p0 到p1 ,他们都是指针,因此加的是4字节

*s + 1 加的是a0 ,a1 等类型的大小,如果是int型那么加的就是4,double型加的就是8

**s + 1 加的是a0 , a1 等存放的值加1

也就是:

s + 1 = s + sizeof(typename*) * 1;

*s + 1 = *s + sizeof(typename) * 1;

 

如果int ** s 中放的是ar0 的首地址,那么s + 1能不能指向ar1呢?

不能,s + 1 = s + sizeof(typename*) * 1; 充其量只能加4字节

那么怎么才能满足呢?  int (*s)[4]

遇到括号先解释括号里面的,再解释括号外的,首先s是指针变量,开辟四字节,能存放数组地址,这个数组开辟4个空间,每个空间都是整型

ar 代表数组首元素地址,&ar代表整个数组的地址,虽然内容一样但是ar++ 加的是4字节,&ar++加的是整个数组的地址

ar2[3] 表示*(*(ar+2)+ 3) ,也可以写成ar[2][3]

注意区分int *s[4] 和 int (*s)[4]

前面s先和数组结合,s是一个数组,存放的是int* 指针变量

而后面的s与*结合,说明s是指针,指向的是数组的地址,这个数组空间是4,每个元素为整型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值