二级指针做函数参数

14 篇文章 2 订阅

在这里插入图片描述
下面围绕对指针数组的操作进行说明

第一种内存模型

#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的时候报错

在这里插入图片描述

回答: 当函数参数传入二级指针时,可以实现返回一个地址的目的。二级指针作为入参,可以在函数内部修改一级指针指向的地址,从而改变实参的值。通过传入一级指针的地址,可以在函数内部将二级指针指向一个新的地址,并返回该地址。这样既能返回一个地址,又能返回一个结果。\[2\] 例如,可以使用二级指针作为入参来实现动态分配内存,并将分配的内存地址返回给调用者。在函数内部,可以通过修改二级指针指向的地址来分配内存,并将分配的地址赋值给一级指针。\[3\] 这样,调用者就可以通过传入一级指针的地址来获取分配的内存地址。 #### 引用[.reference_title] - *1* *3* [C语言函数参数:一级指针二级指针的应用小结](https://blog.csdn.net/u012351051/article/details/120937818)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [函数传参过程中的二级指针问题](https://blog.csdn.net/m0_60413945/article/details/128102042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值