1.一维数组
1.1一维数组 函数的相关用法
比如一个函数的作用是将一个一维数组中的元素进行排序,下面有两种声明方法:
1 void Sort(int a[], int length);
2 void Sort(int* a, int length);
这两种函数的声明方法其实是等效的,在调用函数的时候,都可以直接传入一个数组。
原理就是前者传入了一个数组名,后者传入了数组的首元素的地址(指针),其实都是传递了数组的首地址,函数内部可以通过指针来访问数组的元素,并进行修改,可以理解为没什么差别。
1.2一维数组的动态分配内存
(C++写法)
int size = 10;
int* array = new int[size];
delete[] array;
int* array
声明了一个指向 int 类型的指针,可以理解为指针数组;
2)new int[size]
动态分配了一个包含 size 个 int 元素的连续内存块,并返回指向第一个元素的指针,即基地址;
3)释放内存;
其实许多都是一样的:
C:
struct AdjList* array = (struct AdjList*)malloc(V * sizeof(struct AdjList));
C++:
struct AdjList* array = new struct AdjList[V];
2.二维数组(矩阵)
2.1二维数组 + 函数
1)以列数为参数:
void functionName(int arr[][cols], int rows, int cols);
int arr[3][4];
functionName(arr, 3, 4);
2)使用指针表示:
void functionName(int (*arr)[cols], int rows, int cols);
int arr[3][4];
functionName(arr, 3, 4);
注意这两种函数的写法具有一定局限性:
- 这两种声明方法都是针对
已知列数
的、静态分配的、
二维数组,无法实现动态分配内存。 - 在函数声明中省略列数,即
void printMatrix(int arr[][3])
,在函数内部无法使用sizeof()计算行数和列数!因为函数无法获知二维数组的列数。编译器需要知道每一行有多少列,以便正确地解析数组元素的内存布局。省略列数的声明方法只能用于已知列数的情况,因此无法在函数内部动态地获取列数。
3)指向指针的指针:(可以进行动态内存分配)
void functionName(int** arr, int rows, int cols);
int arr[3][4];
//注意需要将二维数组arr转换为指向指针的指针数组ptr
int* ptr[3];
for (int i = 0; i < 3; i++) {
ptr[i] = arr[i];
}
functionName(ptr, 3, 4);
- 这段代码中,函数的参数是
int** a
,所以如果直接将二维数组arr传递给函数,会导致类型不匹配的错误。因为arr是一个二维数组,而不是一个指向指针的指针。 ptr[i] = arr[i];
的作用是将arr[i](二维数组arr中第i行的首地址)赋值给ptr[i](指针数组ptr中第i个元素),从而完成了二维数组到指针数组的转换。
其实就是ptr是一个指针数组,里面有3个指针(因为对应的arr有3行),这种指针是指向数组的指针。需要将arr每行的首地址赋值给指针数组ptr的相应元素,就可以完成转换。- 可以通过sizeof()来计算数组的行数和列数
- 进行动态内存分配
2.2动态内存分配
- 来计算行数和列数:
void printMatrix(int** arr) {
// 获取行数和列数
int rows = sizeof(arr) / sizeof(arr[0]);
int cols = sizeof(arr[0]) / sizeof(arr[0][0]);
.........
}
- 动态分配内存:
需要为每一行都分配一个指针数组,然后再为每一行的指针数组分配一个数组。也就是数组里面套数组;
int rows = 3;
int cols = 4;
// 分配指向指针的指针(有多少行)
int** matrix = new int*[rows];
// 为每一行开辟空间(每一行有多少元素,也就是有多少列)
for (int i = 0; i < rows; ++i) {
matrix[i] = new int[cols];
}
1)int** matrix
声明了一个指向 int* 类型的指针,就是二维数组;
2)为行分配指针数组,int*[rows]
就相当于一维数组指针嘛,分配几个一维数组;
3)matrix[i] = new int[cols];
再为每一行的矩阵分配具体的内存;
- 释放内存
for (int i = 0; i < rows; ++i) {
delete[] matrix[i]; // 释放每一行的数组
}
delete[] matrix; // 释放行指针数组
先释放每一行指针数组中的元素内存,再释放二维数组中一维数组(个数)的内存;