【基础知识】如何理解指针作为函数参数的输入和输出特性

        在 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’可以将其分配的内存地址保存到主调函数的指针变量中。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值