更新
还没加入小组以前写的博客了,今晚听欢神的技术直播,想到这篇博客了,回来更正如下
例:(动态分配一个arr[2][4]数组)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int (*arr)[4] = (int(*)[4])malloc(sizeof(int)*8);
}
因为什么多维数组都是不存在的!实际上只存在一维数组,多维数组实际上都是为了你理解上的便利抽象出来的,什么行和列,都是抽象的产物。
多维数组本质上是元素是数组的一维数组。
所以以前理解的下面的那种代码,定义int ** 类型的arr,以及先分配行,再分配列,都是不对的。
记得free,我就不写了
以及,
int a[5] &a+1不是首地址+1,系统会认为加一个a数组的偏移,偏移一个数组的大小,原因:&a是数组指针,其类型是int (*)[5]。而指针+1要根据指针类型加上一定的值,不同类型的指针+1增加的大小不同。a是长度为5的int数组指针,所以要加上5*sizeof(int),因此得到的实际是a[5]
所以sizeof(a)返回的是整个数组的大小而不是指针的大小,我觉得是在这里将a视为对象,即整个数组
上面这段话,是以前的理解
int a[5], a是什么,
a既不是常量也不是变量,甚至不是一个“量”——没有对应的内存存储a,哪里来的“量”,它只是一个抽象的对一块内存的描述
我们 int* p = a;可以
是因为编译器做了隐式转换,
但是以下的情况下是不转换的:
做sizeof 和 & 的操作数的时候
即 sizeof(a),a不做隐式转换,表示那一整块内存,即上面所说的抽象的“对象”
所以说,&a + 1的原因也是这样
————————————————————————————————————————————————————————————————————————————
用malloc开辟一个二维数组
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, row, column, **arr;
while (scanf("%d %d", &row, &column) != EOF) {
arr = (int **)malloc(sizeof(int *) * row); // 分配所有行的首地址
for (i = 0; i < row; i ++) { // 按行分配每一列
arr[i] = (int *)malloc(sizeof(int) * column);
}
// 释放开辟的二维数组空间
for (int i = 0; i < row; ++i)
{
free(*(arr + i));
}
}
return 0;
}