指针参数的传值与传址

使用传址的方式才能使针对函数参数所做的处理在函数调用结束后仍然有效,指针参数也是如此。

有如下代码:

#include <stdio.h>

void test(char *p)
{
    printf("in test, before assigning, &p = %x, p point to \"%s\".\n", &p, p);
    p = "hello";
    printf("in test, after assigning, &p = %x, p point to \"%s\".\n", &p, p);
}

int main()
{
    char *p = "hi";

    printf("before test, &p = %x, p point to \"%s\".\n", &p, p);
    test(p);
    printf("in main, , after test, &p = %x, p point to \"%s\".\n", &p, p);

    return 0;
}

g++编译,输出结果为:


这种方式为传值方式,只是把字符串hi的起始地址值存入形参自身的地址,而存储该起始地址值的地址不会被改变。

如上图输出情况所示,地址0x22ff44存储了字符串hi的起始地址值,地址0x22ff20在赋值前存储了字符串hi的起始地址,在赋值后存储了字符串hello的起始地址。

地址0x22ff44存储的值并没有被改变。

若要将函数的处理在调用结束后仍然有效,则需使用传址的方式,函数参数需使用指向指向指针的指针类型,代码如下:

#include <stdio.h>

void test(char **p)
{
    printf("in test, before assigning, p = %x, *p point to \"%s\".\n", p, *p);
    *p = "hello";
    printf("in test, after assigning, p = %x, *p point to \"%s\".\n", p, *p);
}

int main()
{
    char *p = "hi";

    printf("before test, &p = %x, p point to \"%s\".\n", &p, p);
    test(&p);
    printf("in main, , after test, &p = %x, p point to \"%s\".\n", &p, p);

    return 0;
}
g++编译,输出结果为:


使用这种方式就可以在函数中改变地址0x22ff44存储的值了,即将原来存储的字符串hi的起始地址值改为字符串hello的起始地址值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值