char *string="abc" 中,是将string指向常量"abc",如果执行以下方法会报内存不能为written的错误:
void change(char *s){
*s='A';
}
解决方法是定义string为字符数组:
char string[]="abc";
关于const的具体作用
A。const最经常的用法
1.为了防止传递的函数参数不被修改,在调用函数的形参中用const关键字.
int FindNum(const int array[], int num, int count){
...
}
编译器会把array[]当作常量数据的数组看待。所以,假如你不小心给数组赋值,那么编译器就会报错了
2.const可以用来创建数组常量、指针常量、指向常量的指针等:
const char ch = 'a';
const int a[5] = {1, 2, 3, 4, 5};
const int *p = a; //a是一个数组的首地址.p是指向常量的指针
int * const p = a; //a是一个数组的首地址.p是指针常量;
const int * const p = a; //a是一个数组的首地址。p是指向常量的指针常量
——const int *p = a; //p是指向常量的指针,因此,不可以通过给指针赋值来改变数组
//中的数据,例如:
// *p = 10; /*错误*/
// *(p + 2) = 1; /*错误*/
——int * const p = a; //p是指针常量,我们知道,指针是指向了一个数组的首地址,
//那么,它的位置就不可以改变了。但可以通过指针改变数组中的数据
// *p = 2; /*可以*/
// *(p+1) = 10; /*可以*/
// p++; /*不可以*/
B。const并不会阻止参数的修改
在函数参数中用了const就一定不可以改变是错误的理解,因为,它并不阻止参数的修改,下面举个简单的例子来阐述一下
{
char str[] = "The C programme";
Change(str);
printf(str);
system("Pause");
return 0;
}
void ChangeStr(const char *String)
{
char *Source = (char *)String;
while (*Source)
{
*Source = toupper(*Source);
Source++;
}
}
程序把字符串中的每个字符都转换成大写字母了。因为*String把地址给了*Source,而*Source的值的改变编译器并不干涉,可能有的编译器会发出警告之类。上面的程序只是为了说明const并不会阻止