有些东西,当我将它们传递给函数时,我仍然不太明白指针。 如果申报像传递指针作为函数参数的语义是什么?
void help (const int *p)
功能我可以修改参数p
功能help
内? 我可以更改指针所指的内容吗?
感谢您的澄清。
有些东西,当我将它们传递给函数时,我仍然不太明白指针。 如果申报像传递指针作为函数参数的语义是什么?
void help (const int *p)
功能我可以修改参数p
功能help
内? 我可以更改指针所指的内容吗?
感谢您的澄清。
是的,你可以修改p
。但是,它在呼叫者中不会改变。 C是一种通过价值的语言。查看C FAQ,该FAQ有一个关于exactly this situation的问题。
在这种情况下,由于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
都不会修改内存中的其他位置对调用方不可见。
理解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
。
我有点困惑。所以如果它是“int const * p;”我可以改变* p的值,但是我可以改变它在内存中的位置,以及“int * const p;”的相反位置。 – 2012-02-15 02:26:21
是的。 'int const * p'/'const int * p'表示您可以更改'p',但不更改'* p'。和'int * const p'相反。 – 2012-02-15 08:56:49
那么,在那种情况下,你不能,因为它声明'const',但通常是yep - 见上面。 – jka6510 2012-02-15 01:22:43
良好的电话 - 我会解决这个问题。 – 2012-02-15 01:23:02
为什么不能修改'help'中的'p'副本?声明中的“const”只应表示“p”指向常量数据,因此不应允许使用“* p = 5”这样的语句。 – 2012-02-15 01:59:46