当你将它们传递给函数时,有些东西我仍然不太明白指针。 如果声明像
这样的函数void help (const int *p)
我可以修改函数p
中的参数help
吗?
我可以更改指针指向的内容吗?
感谢您的澄清。
答案 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
。