在 C语言中,指针可以作为函数参数传递。当指针作为函数参数传递时,它可以用作输入和输出。
1. 指针作为函数参数的输入特性
在 C语言中,将指针作为函数参数传递,可以实现一个变量的地址传递给函数,从而在函数内部可以访问到这个变量的值,这样的参数传递方式称为指针的输入特性。在函数内部,可以通过指针来读取变量的值,但不能修改原来的值。
指针作为函数参数的输入特性是指,函数可以使用指针来访问调用函数时,传递给函数的数据。换句话说,函数可以使用指针来读取传递给它的数据。
#include <stdio.h>
// 函数通过指针作为参数,实现输入特性
void printValue(int* ptr) {
printf("Value: %d\n", *ptr);
}
int main() {
int num = 42;
printValue(&num); // 将 num 的地址传递给函数
return 0;
}
在上面的示例中,‘printValue’函数接受一个指向‘int’类型的指针作为参数,并通过解引用操作符‘*’来读取指针指向的变量的值。在‘main’函数中,我们将‘num’的地址传递给‘printValue’函数,从而在函数内部可以访问到‘num’的值。
2. 指针作为函数参数的指针传递,实现输出特性
函数可以通过指针参数来修饰调用者传递的变量的值,从而可以将计算机结果返回给调用者。此时,指针参数在函数内部的作用类似于一个返回值,只不过它的值是由函数计算得出的。
指针作为函数参数的输出特性是指,函数可以使用指针来修改调用函数时传递给函数的数据。换句话说,函数可以使用指针来写入新的数据到传递给它的数据的地址上。
#include <stdio.h>
//函数通过指针作为参数,实现输出特性
void updateValue(int* ptr) {
*ptr = 99; // 修改指针指向的变量的值
}
int main() {
int num = 42;
printf("Before: %d\n", num);
updateValue(&num); // 将 num 的地址传递给函数
printf("After: %d\n", num); // 函数修改了 num 的值
return 0;
}
在上面的示例中,‘updateValue’函数接受一个指向‘int’类型的指针作为参数,并通过解引用操作符‘*’来修饰指针指向的变量的值。在‘main’函数中,我们将‘num’的地址传递给‘updateValue’函数,从而在函数内部可以修改‘num’的值,导致‘main’函数中第二个‘printf’输出了修改后的值。
3. 示例
- 输入特性:主调函数中分配内存,被调函数使用
- 输出特性:被调函数中分配内存,主调函数使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//1、输入特性:主调函数中分配内存,被调函数中使用内存
void func(char*p)//被调函数
{
strcpy(p,"hello world");
}
void test01()//主调函数
{
//分配到栈上
char buf[1024] = {0};
func(buf);
printf("%s\n",buf);
}
void printString(char *str)//被调函数
{
printf("%s\n",str);
}
void test02()//主调函数
{
//分配到堆区
char*p = malloc(sizeof(char)*64);
memset(p,0,64);
strcpy(p, "hello world");
printString(p);
}
//2、输出特性:被调函数分配内存,主要调用函数使用内存
void allocateSpace(char**pp)//被调函数
{
char *temp = malloc(sizeof(char)*64);
memset(temp, 0, 64);
strcpy(temp, "hello world");
*pp = temp;
}
void test03()//主调函数
{
char*p = NULL;
allocateSpace(&p);
printf("%s\n",p);
}
int main()
{
//test01();
//test02();
test03();
return EXIT_SUCCESS;
}
在函数‘func’中,参数‘p’是一个指向字符的指针,它作为输入参数传递给函数。在函数内部,使用‘strcpy’函数将字符串‘hello world’复制到‘p’指向的内存中。由于参数‘p’指向的内存是由主调函数‘test01’分配的,因此可以将其视为输入特性。函数‘func’只是在主调函数分配的内存中进行操作,不会分配新的内存。
在函数‘printString’中,参数‘str’是一个指向字符的指针,它作为输入参数传递给函数。在函数内部,使用‘printf’函数输出字符串。与‘func’函数不同,‘printString’函数只是输出主调函数传递给它的字符串,并不修改它,因此也可以将其视为输入特性。
在函数‘allocateSpace’中,参数‘pp’是一个指向指针的指针,它作为输出参数传递给函数。在函数内部,使用‘malloc’函数分配了一个大小为 64 字节的内存块,并将字符串‘hello world’复制到该内存中。由于参数‘pp’指向的内存是在函数内部分配的,因此可以将其视为输出特性。通过在主调函数中传递指向指针的指针,函数‘allocateSpace’可以将其分配的内存地址保存到主调函数的指针变量中。