传递指向常量的指针是C中常用的技术,效率很高,因为我们只传了数据的地址,能避免某些情况下复制大量内存。不过,如果只是传递指针,数据就能被修改。如果不希望数据被修改,就要传递指向常量的指针。
在本例中,我们传递一个指向整数常量的指针和一个指向整数的指针。在函数内,我们不能修改通过指向常量的指针传进来的值:
void passingAddressOfConstants(const int* num1, int* num2) {
*num2 = *num1;
}
int main() {
const int limit = 100;
int result = 5;
passingAddressOfConstants(&limit, &result);
return 0;
}
这样不会产生语法错误,函数会把100赋给result
变量。在下面这个版本的函数中,我们试图修改两个被引用的整数:
void passingAddressOfConstants(const int* num1, int* num2) {
*num1 = 100;
*num2 = 200;
}
如果我们把limit
常量传递给函数的两个参数就会导致问题:
const int limit = 100;
passingAddressOfConstants(&limit, &limit);
这样会产生一个语法错误,抱怨第二个形参和实参的类型不匹配。此外,它还会抱怨我们试图修改第一个参数所引用的常量。
该函数期待一个整数指针,但是传进来的却是指向整数常量的指针。我们不能把一个整数常量的地址传递给一个指向整数的指针,因为这样会允许修改常量。1.4.2节有详细讨论。
像下面这样试图传递一个整数字面量的地址也会产生语法错误:
passingAddressOfConstants(&23, &23);
这种情况错误信息会指出取地址操作符的操作数需要的是一个左值。