我的印象是C中的const值无法更改。然而,我写了这个人为的例子,至少对我而言似乎改变了常数的价值。这是代码:
#include <stdio.h>
#include <unistd.h>
void test(const char* buffer, int num);
int main(){
const char buffer[10];
test(buffer, 1);
printf("main 1: %s\n", buffer);
test(buffer, 2);
printf("main 2: %s\n", buffer);
return 0;
}
void test(const char* buffer, int num) {
read(0, (void *)buffer, 10);
printf("test %da: %s", num, buffer);
buffer = "num";
printf("test %db: %s\n", num, buffer);
}
这是输出:
me@computer:~/C$ ./a.out
123
test 1a: 123
test 1b: num
main 1: 123
456
test 2a: 456
test 2b: num
main 2: 456
每次调用const buffer
后,main中的test()
的值都会更改。为什么呢?
在test()
中,我可以在方法范围中将buffer
的值更改为"num"
,我认为这是不可能的......?
"num"
时将缓冲区的值更改为test()
时,该更改不会反映在main()
中,因为传递值有意义。但是,buffer
中的main()
确实发生了变化。输入到"num"
的调用中的值存储在read()
中,而不是buffer
。首先,为什么值"num"
不是因为那行代码在read()
之后?其次,为什么buffer
中的main()
发生了变化? 修改 的:
我刚想到一个想法:如果类型转换可以取消const
修饰符,那么使用const
参数的意义何在?我认为这是为了保证传递给函数的值不会被改变。这种解决方法似乎打败了它的整个目的......
答案 0 :(得分:2)
因为您已使用类型转换删除const
。
您正在将指针的值更改为"num"
的地址。你没有制作指针const
,只是指向它。因此,您可以将指针本身更改为指向其他位置。要使指针本身const
,请尝试const char * const buffer
请参阅2.您刚刚更改了本地参数buffer
指向的位置。这不会改变主要的局部变量buffer
指向的地方。