C语言如何传递指针参数

1.什么是指针

简单来说,指针是一个存储计算机内存地址的变量。所有的指针都存储了内存地址。它们的类型只在取值时起作用。指针在C语言中是个十分重要的概念,可以搜索相关资料进行深入学习,也可以参考 C语言指针简介 简单了解。

2.指针参数

C语言函数参数传递有两种方式,一种是传值调用,一种是传址调用。那么如果指针作为参数,应该怎么传递指针?可以参见下面的例子。

/* 编译器版本:
 * 用于 x86 的 Microsoft (R) C/C++ 优化编译器 18.00.30723 版版权所有(C) Microsoft Corporation。保留所有权利。
 */
#include <stdio.h>

/* 错误版本,指针p是指针str的一个拷贝,所以这种方法仅初始化指针p,而对指针str无影响 */
void Allocate_wrong(char *p,int size){    
    printf("\n%x",&p);
    printf("\n%x",p);
    p=(char*)malloc(size);
} 

void allocate(char **p, int size) {
	printf("\n%x", &p);
	printf("\n%x", p);
	*p = (char*)malloc(size);
}

int main(void) {
	char *str = NULL;
	printf("\n%X", &str);
	printf("\n%X", str);
	allocate(&str, 100);
	strcpy(str, "Hello World!");
	printf("\n%s", str);
	free(str);
	return 0;
}
/*
输出结果:

1BF88C
0
1bf7b4
1bf88c
Hello World!

*/

从中我们可以看出,C语言中传递指针变量时,需要用到二级指针。示例中char **p = &str;表明p是一个二级指针,*p存放的是指针str的地址。因此对*p进行操作,也就是对str进行操作。

3.总结

  1. 修改普通类型变量(如intchar等),函数参数需要用一级指针;
  2. 修改指针变量,函数参数需要用二级指针;
  3. 以上都是C语言里面的操作,当然C++可以用引用(例如int *&p = str;)。