将指针作为函数参数传递的语义是什么?

时间:2012-02-15 01:18:11

标签: c pointers syntax

当你将它们传递给函数时,有些东西我仍然不太明白指针。 如果声明像

这样的函数
void help (const int *p)

我可以修改函数p中的参数help吗? 我可以更改指针指向的内容吗?

感谢您的澄清。

3 个答案:

答案 0 :(得分:4)

是的,您可以修改p。但是,它不会在调用者中更改。 C是一种按值传递的语言。查看C FAQ,其中包含exactly this situation的问题。

答案 1 :(得分:1)

在这种情况下,由于p被声明为const int *,编译器将禁止尝试修改p

但是,如果p是普通的int *,则可以修改p指向的内容,并且调用者会注意到。{1}}说你写道:

void foo(void) {
    int n = 100;

    help1(&n);
    printf("n = %d", n);

    n = 100;
    help2(&n);
    printf("n = %d", n);
}

void help1(int *p) {
    *p = 50;
}

void help2(int *p) {
    p = (int *)malloc(sizeof(int));
    *p = 50;
    free(p);
}

然后调用foo()会导致您的程序打印

n = 50
n = 100

在此程序中,help1更改了p指向的内容,并且调用者可以看到它。另一方面,help2使p指向内存中的不同位置,而help2所做的任何操作都可以修改内存中的其他位置对调用者不可见。

答案 2 :(得分:1)

理解C中常量符号的最简单方法是大声说出声明。从名称开始,然后左转:

const int *p; // 'p' is a pointer to an int that is const

这相当于:

int const *p;

这表明你可以改变p指向的位置,但是你不能改变它指向的位置。所以你有只读访问权限。但是如果你有这样的东西:

int * const p; // 'p' is a const pointer to an int

...然后您可以根据需要更改p指向的内存,但无法更改p