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" 字符串的地址
答案跟分析的结果一模一样
例题到这里就结束了,不知道你对于指针和数组名的理解有没有更加深刻呢?咱们在评论区见