C语言函数传参与指针

penkgao 2020-06-25

搬运自我的CSDN https://blog.csdn.net/u013213111/article/details/106732955

C语言的函数传参只有传值的方式,想要在函数中修改参数值的话就需要传入参数的地址也就是指向这个参数的指针了。
需要注意的情况是待修改的参数本身就是一个指针的时候,要传入这个指针本身的地址,也就是指向指针的指针。
看这样的一个例子:当希望用init函数对传入的指针int型ptr分配空间,init接受的参数是int **arr,是一个指向指针的指针,而调用init函数时,需要传入的参数是&ptr,也就是ptr的地址。

#include <stdio.h>
#include <stdlib.h>

int init(int **arr, int size)
{
	*arr = malloc(sizeof(int) * size);
	if (NULL == *arr) {
		printf("malloc failed\r\n");
		return 1;
	}

	printf("addr %x\r\n", *arr);
	int *pdata;
	pdata = *arr;
	for (int i = 0; i < size; i++) {
		//pdata[i] = i; //correct
		//(*arr)[i] = i; //correct
		//((*arr) + i) = i; //wrong
		//pdata = (*arr + i); //correct
		//*pdata = i;
		*(*arr + i) = i; //correct
	}
	return 0;
}

void deinit(int **arr)
{
	if (NULL != *arr) {
		printf("addr %x\r\n", *arr);
		free(*arr);
		*arr = NULL;
	}
}

int main(void)
{
	static int *ptr = NULL;
	int size = 4;

	if (0 == init(&ptr, size)) {
		printf("ptr addr %x\r\n", ptr);
		for (int i = 0; i < 4; i++) {
			printf("ptr val %d\r\n", ptr[i]);
		}
		deinit(&ptr);
	}	

	return 0;
}

相关推荐