萌新,学习随笔,有不恰当的地方欢迎指正
//本篇有一个可能模糊的地方 //数组为a[3][4] ,完全赋值时inta[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //代码中只初始化了3个值,其中剩余未初始化的值为0
首先要知道的一个事情是: 数组名=数组首地址 二维数组的数组名同样
#include<stdio.h>
int main(int argc, char const *argv[])
{
int a[3][4] = {{12,34,42},{23,54,675}};
return 0;
}
此代码中,所有打印出来的值都是相同的 均为数组的首地址
printf("%#x\n", a);
printf("%#x\n", &a);
printf("%#x\n", &a[0][0]);

用指针操作:
普通指针:
int* p = a;
int* s = &a;
 ########################################################################################### 用指针访问数组中的值
int a[3][4] = {{12,34,42},{23,54,675}};
int *p = a;
printf("%d\n", (*p));
这里的p指向数组的首地址,也就是数组的首元素的地址 int型的指针一次从地址中取出4字节空间,正好数组里面的值也是4字节的,从数组的头开始取4字节 正好取完了a[0]数组当中的第0个元素 ,所以打印的结果为12.  这里牵扯到了一个指针取值的问题 int型的指针一次只操作4字节的内存,char一个字节…
用地址的加减取值 地址的加减,地址肯定会发生大小的变化 先看地址变化的案例,同样的代码,稍加修改后  打印p指向的地址和a的地址是相同的,毋庸置疑 重点在最后一行的地址,相比p的地址不难发现,值加1,地址加一个int类型的长度(因为P是int类型的指针) 再取值,只需要用*取出p + 1的值,这里的p + 1要加括号哦,参考C语言运算符优先级
二维数组指针
在这个代码中,编译器会给我们这个警告
int a[3][4] = {{12,34,42},{23,54,675}};
int *p = a;
 提示中已经很明确告诉我们了,右边的类型为’int (*)[4]’ 正确写法:
int a[3][4] = {{12,34,42},{23,54,675}};
int (*p)[4] = a;
- 这里如果单独取p的值,p和a是相等的
 现在又出现了一个问题,如果我现在把指针p+1呢? 话不多说,直接看结果  地址的结尾从90变成了a0,也就是说增加了16个字节的地址,这16个字节从哪里来的呢? 指针的类型 * 所指向数组的列 即 int * 4 == 16 int就是int (*p)[4]的int,4当然就是int (*p)[4]中的4了 ============================================== 单从地址上分析,指针向后偏移了16个字节,那么指针目前所指向的位置就是a[1][0]的地址 事实也的确如此  这时想要取出数组中的23怎么取呢? 数组名+下标 下标我们很显而易见,第一个数字,也就是0号元素 数组名呢? 测试发现只能用*(p + 1)[0]来取值,数组名我也解释不太明白,希望补充

|