二级指针做函数参数
程序员文章站
2024-01-01 17:59:22
...
下面围绕对指针数组的操作进行说明
第一种内存模型
#include "stdio.h"
#include <stdlib.h>
#include <string.h>
void printArr(char** arr,int num) {
if (arr == NULL)return -1;
for (int i = 0; i < num; i++) {
printf("%s\n", arr[i]);
}
}
int sortArr(char** arr, int num) {
if (arr == NULL)return -1;
for (int i = 0; i < num; i++){
for (int j = i + 1; j < num; j++) {
if (strcmp(arr[i], arr[j]) > 0) {
//交换数组元素,从小到大排列
char *tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
void main() {
//定义一个数组指针,即数组元素是指针类型
//[]优先级高于*
char* arr[]= {"aa","cc","bb","dd"};
printArr(arr,4);
printf("排序之后\n");
sortArr(&arr, 4);
printArr(&arr, 4);
}
一开始未初始化前的内存
初始化数组后,调用printArr(arr,4)输出函数,形参是arr,实参是arr1
因为arr数组,数组名arr本来就是个指针,指向数组的首地址。现在又在arr前面加上了号,就相当于arr现在是个二级指针。
形参中arr是个二级指针,所以实参中arr1也应该是传递二级指针。
arr相当于&arr
把char 类型换做int,发现实参是一级指针,形参是二级指针,这本来就符合C中调用函数时形参(+&)与实参(+*)的约定
但是为什么上面的形参与实参之间是都是二级指针,疑惑了?
第二种内存模型
#include "stdio.h"
#include <stdlib.h>
#include <string.h>
int i;
int printArr(char* buff,int num) {
for (i= 0; i < num; i++) {
printf("%s ", buff[i]);
}
return 0;
}
void main() {
char buff[10][30] = { "aaa","bbb","ddd","111" };
printArr(buff, 4);
}
参数不管是char* buff,还是char** buff都无法输出
方法一
二维数组不写死的话,第一个应该不写死
第三种内存模型
#include "stdio.h"
#include <stdlib.h>
#include <string.h>
int i;
int printArr(char **buff,int num) {
for (i= 0; i < num; i++) {
printf("%s ", buff[i]);
}
return 0;
}
void main() {
int i;
char **pArray= (char **)malloc(100*sizeof(char *));//指向了一个二维数组
pArray[0]=(char *)malloc(8*sizeof(char));
pArray[1]=(char *)malloc(8*sizeof(char));
pArray[2]=(char *)malloc(8*sizeof(char));
pArray[3]=(char *)malloc(8*sizeof(char));
strcpy(pArray[0],"aa");
strcpy(pArray[1],"dd");
strcpy(pArray[2],"cc");
strcpy(pArray[3],"bb");
printArr(pArray, 4);
}
可见分配的一维数组是个连续的内存段
可见在一维数组的各个元素里又嵌套分配一个一维数组,这个内存不一定是连续了。如pArray[0]指向的的内存地址是009d1020,
pArray[1]指向的内存地址是009d1068
即二维数组在内存中不是一个连续的内存段。