二维数组,二级指针,指针数组,数组指针傻傻分不清

用的是64位的编译器,所以一个指针8字节

举例子

二维数组 == 数组指针 ------>空间连续
int a[2][3] = { {2,3,6},{20,40,60}} ; //定义了行为2,列为3的数组,sizeof(a) = 4*6 =24
//此时变量a就是一个数组指针
int(*b)[3]; //数组指针,一个指向3个数组的指针,在这里就是3列
//因为[]优先级大于*  所以要加括号表明这是一个 int指针

在这里插入图片描述

二级指针 == 指针数组 ------>空间不连续
int*c[2] //一个数组c里面 存放着两个int*指针 ,sizeof(c) = 2*8 =16字节
int** d //一个二级指针

我们对其赋值

int p[3] = { 2,4,6 };
int q[3] = { 1,3,5 };
int* c[2] = { p, q };
int** d = NULL;
d = c;	// c可能是非连续的
for (int i = 0; i < 2; i++) {
	for(int j = 0; j < 3; j++) {
		printf("d[%d][%d]=%d\r\n", i, j, *(d[i] + j));
	}
}

在这里插入图片描述

附加 数组的特性

int a[10] = {0};
// a 数组名  也是 数组首元素的地址   是个常量
//  变量的本质是内存空间的别名,一定义数组就会分配内存,内存就固定了,所以数组名起名就不能更改了
// &a 数组地址
// 数组首元素地址和数组数组地址相等

附加 数组作函数参数的特性 —> 为啥我传了数组进函数 不能sizeof数组大小啊

在函数里 把数组作为函数参数传入 不能 sizeof 数组的大小
因为 编译器在自动优化函数参数

// 一维数组
//编译器优化 int a[10]  => int a[]  => int *a
void find_arry(int a[10]); //垃圾写法
void find_arry(int *a);  //正确写法

//二维数组
//编译器优化 int a[10][30]   => int a[][30]  => int (*a)[30]   最后变成数组指针啦
void find_arry(int a[10][40]);  //垃圾写法
void find_arry(int (*a)[40]);  //正确写法

在这里插入图片描述

内存示意图

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值