const关键字作用:
- const定义一个常量,这个常量再定义的时候必须进行初始化,否则以后没机会
#include <stdio.h>
int main(void)
{
const int i=0;
i=10;
printf("i=%d\n",i);
return 0;
}
编译报错:变量 i 为只读
const.c: In function ‘main’:
const.c:7:3: error: assignment of read-only variable ‘i’
i=10;
变量 i 是const定义,不能被单独复制,只能在初始化时赋值
- 实际上const定义的变量并不是一个真正的常量
#include <stdio.h>
int main(void)
{
const int i=10;
int *pt=&i;
*pt = 20;
printf("i=%d\n",i);
return 0;
}
编译提示警告:
const.c: In function ‘main’:
const.c:7:10: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
int *pt=&i;
^
运行结果
vain@ubuntu:~/dst$ ./a.out
i=20
const定义的变量不能普通赋值修改,可以通过指针来修改他的值
#include <stdio.h>
int main(void)
{
const int i=3;
char arr[i] = {'a','b','c'};
printf("i=%d\n",i);
return 0;
}
编译报错:字符数组的范围要用常量,i 为变量
const.c: In function ‘main’:
const.c:7:2: error: variable-sized object may not be initialized
char arr[i] = {'a','b','c'};
^~~~
const.c:7:17: warning: excess elements in array initializer
char arr[i] = {'a','b','c'};
^~~
const.c:7:17: note: (near initialization for ‘arr’)
const.c:7:21: warning: excess elements in array initializer
char arr[i] = {'a','b','c'};
^~~
const.c:7:21: note: (near initialization for ‘arr’)
const.c:7:25: warning: excess elements in array initializer
char arr[i] = {'a','b','c'};
^~~
const.c:7:25: note: (near initialization for ‘arr’)
i 被const定义,本质上是变量 。
- const 和指针的用法
const int *pt;
int const *pt; :两者都是相同的,都代表pt指针可以指向任意对象,但是不能通过 pt 指针来修改指向对象。
#include <stdio.h>
int main(void)
{
const int i=3;
const int *pt = &i;
*pt=10;
printf("i=%d\n",i);
return 0;
}
编译报错:提示指针 *pt 为只读变量,pt指针指向的内容不能修改。
const.c: In function ‘main’:
const.c:9:5: error: assignment of read-only location ‘*pt’
*pt=10;
^
#include <stdio.h>
int main(void)
{
const int i=3;
int j = 100;
const int *pt = &i;
pt = &j;
printf("i=%d\n",i);
printf("*pt = %d\n",*pt);
return 0;
}
运行结果 : *pt指针的值不能修改,pt可以指向其他位置
i=3
*pt = 100
- int *const pt : pt 指针必能指向其他位置,但是可以通过 pt 指针修改指向位置的值
#include <stdio.h>
int main(void)
{
const int i=3;
int j = 100;
int *const pt = &i;
pt = &j;
printf("i=%d\n",i);
printf("*pt = %d\n",*pt);
return 0;
}
编译报错:编译报错 pt 被const定义,pt指向的地址不能改变,*pt的值可以改变
const.c: In function ‘main’:
const.c:7:18: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
int *const pt = &i;
^
const.c:8:5: error: assignment of read-only variable ‘pt’
pt = &j;
^
#include <stdio.h>
int main(void)
{
const int i=3;
int j = 100;
int *const pt = &i;
*pt = 10;
printf("i=%d\n",i);
return 0;
}
运行结果:
i=10
- const定义函数形参
#include <stdio.h>
int add(const int *pt1,const int *pt2)
{
return *pt1+*pt2;
}
int main(void)
{
int i=3;
int j = 100;
int sum;
sum = add(&i,&j);
printf("sum = %d\n",sum);
return 0;
}
运行结果:
sum = 103
const修饰的形参也是不能显性修改
#include <stdio.h>
int add(const int *pt1,const int *pt2)
{
*pt1+=10;
*pt2+=20;
return *pt1+*pt2;
}
int main(void)
{
int i=3;
int j = 100;
int sum;
sum = add(&i,&j);
printf("sum = %d\n",sum);
return 0;
}
编译报错:
const.c: In function ‘add’:
const.c:5:6: error: assignment of read-only location ‘*pt1’
*pt1+=10;
^~
const.c:6:6: error: assignment of read-only location ‘*pt2’
*pt2+=20;
^~