【C语言进阶】3.指针进阶例题

1.一维数组名的含义

1.1 整型数组

在这里插入图片描述

1.2 字符数组

1.2.1 结合sizeof 理解

在这里插入图片描述
在这里插入图片描述

1.2.2 结合strlen理解

在这里插入图片描述
在这里插入图片描述

2.指针的含义(重点)

2.1 结合sizeof理解

在这里插入图片描述

2.2 结合strlen理解

在这里插入图片描述

3. 二维数组名的含义

3.1 结合sizeof 理解

在这里插入图片描述

4. 指针运算(重点)

在这里插入图片描述
&a取出的数组的地址,&a的类型是数组指针类型( int(* )[5] ) 数组指针+1跳过一整个数组(跳过int(* )[5]空间)
将数组指针强制类型转换成int*类型 ptr是int*类型 ptr-1减少一个整型空间 所以ptr-1指向5位置
a 表示的是首元素地址 a+1跳过1个整型 所以a+1指向2位置

在这里插入图片描述
p是结构体指针类型(struct Test *)结构体指针+1跳过一个结构体
所以 0x100000 +0x1 跳过20个字节 所以是0x100014 (0x表示16进制 20在16进制是14)
p强制类型转换成unsigned long 类型 转换成整型 +1就是+1
1048576 +1 --> 1048577 再以%p的形式打印(打印地址(二进制)) 0x100001
p 强制类型转换成 unsigned int *类型 整型指针 +1跳过一个整型
0x100000 + 4

在这里插入图片描述
&a +1 跳过整个数组 指向数组最后
a是首元素地址 int* 类型 强转成 int 类型 +1 跳过1个字节
ptr1[-1] == *(ptr1 -1) 减1 跳过1个ptr(int*)类型
ptr2 是整型指针 对其解引用访问1个整型空间4个字节 也就是从ptr2开始往后访问4个字节
又因为计算机是以小端形式存储的 取出的值 02 00 00 00
同理 ptr1[-1] 取出的值 00 00 00 04

在这里插入图片描述
(0,1) 是逗号表达式 返回的是最后1个值 ,所以int a[3][2] 是不完全初始化
int * p = a [0]
a[0] 表示的是第一行的数组名

p[0]  == a[0][0]

在这里插入图片描述
p 是数组指针 指向的是 4个整型的数组空间 +1跳过4个整型
a 是5 * 5二维数组 a是首元素的地址 一维数组的地址 加1跳过5个整型的一维数组
p[4][2] == *(*(p+4)+2) 指向的就是蓝色区域
a[4][2] == *(*(a+4)+2) 指向的就是红色区域
两个指针相减的绝对值得到的是元素个数
所以&p[4][2]-&a[4][2] 就是-4 以%d的形式打印就是-4
%p(地址)的形式打印 -4 在内存中存储的是补码形式
%p 就认为内存中的是地址(不会进行原反补的转换) 直接输出 0xFF FF FF FC

在这里插入图片描述
&aa +1 跳过整个二维数组 强转成 int * 类型 减1跳过1个整型
aa 是数组名(首元素地址) 一维数组的地址 加一跳过1个一维数组(第二行)强转成 int * 类型 减1跳过1个整型
所以分别是 10 5

在这里插入图片描述
char** pa 应该拆分成 char* (pa)
int 类型的指针 int*p 加一跳过1个整型
char
类型的指针 char* (*pa) 加一跳过一个char* 类型
所以指向"at" 字符串
以%s的形式打印 *pa
*pa 指向的是"at" 字符串的地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
答案跟分析的结果一模一样

例题到这里就结束了,不知道你对于指针和数组名的理解有没有更加深刻呢?咱们在评论区见

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值