2012-02-15 99 views

回答

4

是的,你可以修改p。但是,它在呼叫者中不会改变。 C是一种通过价值的语言。查看C FAQ,该FAQ有一个关于exactly this situation的问题。

+0

那么,在那种情况下,你不能,因为它声明'const',但通常是yep - 见上面。 – jka6510 2012-02-15 01:22:43

+0

良好的电话 - 我会解决这个问题。 – 2012-02-15 01:23:02

+0

为什么不能修改'help'中的'p'副本?声明中的“const”只应表示“p”指向常量数据,因此不应允许使用“* p = 5”这样的语句。 – 2012-02-15 01:59:46

1

在这种情况下,由于p被声明为const int *,所以修改p的尝试将被编译器拒绝。

但是,如果p是一个普通的旧int *,您可以修改p指向的东西,并且调用者会注意到。假设你写道:

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都不会修改内存中的其他位置对调用方不可见。

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

+0

我有点困惑。所以如果它是“int const * p;”我可以改变* p的值,但是我可以改变它在内存中的位置,以及“int * const p;”的相反位置。 – 2012-02-15 02:26:21

+0

是的。 'int const * p'/'const int * p'表示您可以更改'p',但不更改'* p'。和'int * const p'相反。 – 2012-02-15 08:56:49

相关问题