第一种: 指针数组作为输入参数
char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};//指针数组,数组中的每个元素都是指针,
int num = 4;
void printMyArray11(char **myArray, int num) { int i = 0; for (i=0; i<num; i++) { //printf("%s ", myArray[i]); printf("%s ", *(myArray+i) ); } }
正确地调用方法:
printMyArray11(myArray, num);
第二种 : 二级指针作输入---内存模型(分配内存块已知的情况)
char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
int num =4;
作为如下函数的实参,不能实现功能,
//错误调用方法:
void printMyArray02_err(char **myArray, int num) { int i = 0; for (i=0; i<num; i++) { //printf("%s ", myArray[i]); printf("%s ", *(myArray+i) ); // } }
正确调用方法:
void printMyArray02(char myArray[10][30], int num) { int i = 0; for (i=0; i<num; i++) { //printf("%s ", myArray[i]); printf("%s ", *(myArray+i) ); // } }
理由:指针步长不一样,指针所指向的内存空间的数据类型不一样。
第三种:内存模型:通过堆进行分配内存
//在主函数中进行变量的定义(如下) char ** p2 =NULL; //定义子函数 char **GetMem(int num) { int i = 0; char **p2 = NULL; p2 = (char **)malloc(sizeof(char *) * num); if (p2 == NULL) { return NULL; } for (i=0; i<num; i++) { p2[i] = (char *)malloc(sizeof(char) * 100 ); //char buf[100]; sprintf(p2[i], "%d%d%d", i+1, i+1, i+1); } return p2; } //主函数中调用 p2 = GetMem(num); //操作完之后一定要调用如下的释放内存函数进行释放 void GetMemFree(char **p2, int num) { int i = 0; //释放内存 for(i=0; i<num; i++) { if (p2[i] != NULL) { free(p2[i]); p2[i] = NULL; } } if (p2!=NULL) { free(p2); } }
二级指针的三种内存模型如下所示: