二級指針做函數參數

2020-08-11 22:27:45

在这里插入图片描述
下面 下麪圍繞對指針陣列的操作進行說明

第一種記憶體模型

#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
即二維陣列在記憶體中不是一個連續的記憶體段。
在这里插入图片描述

需要注意的是,如果存進記憶體的值的位元組數大於malloc分配的記憶體,會在free的時候報錯

在这里插入图片描述