const int *p;
int const* p;
int* const p;
傻傻分不清楚, 上大学时没有理解清楚的知识点,终于知道咋回事了。
const int *p; // const修饰的是*p,因此*p是常量不能改变,但可以改变p的指向;
int const* p; // 同上,主要是看const与*的前后关系;
int* const p; // const修饰的是p,因此p的指向是常量不能改变,但*p可以改变;
const int const *p; // 两个const既修饰了*p也修饰了p,因此*p与p都是常量不能改变;
下面贴一点代码:
#include "stdio.h"
int main(int argc, char const *argv[]) {
int a = 80;
int b = 88;
const int *p ;
p=&a;
p=&b;
printf("%d\n",*p );
int* const p1=&a;
//p1 = &b;
//storage/c/10/const.c:12:6:
//error: assignment of read-only variable ‘p1’
//错误:只读变量P1的赋值
printf("%d\n",*p1 );
return 0;
}
请注意看报错信息。
由此可以知道,const比较害羞,谁离他近,他就修饰谁。
一个用法:
//如果函数的意图并不是修改数组的数据内容,
//只是用到数组里面的数据,那么形参可以定义成const开头的
//比如进行输出一些字符串:
void put1(const char * string) {
while (*string) {
putchar(*string++);
}
}
***********************万能的分割线*********************
以前都是在win下学习C,现在搬到linux上面,要习惯这两个参数的存在。argc表示有几个参数(加上自身这个可执行文件) argv表示字符串数组把argc个参数都列出来。举个栗子:
#include "stdio.h"
int main(int argc, char const *argv[]) {
int i=0;
for ( i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
return 0;
}
在命令行调用编译后的程序
./a.out "aaa bbb" ccc
输出:
./a.out
aaa bbb
ccc
在命令行调用编译后的程序
./a.out aaa bbb ccc
输出:
./a.out
aaa
bbb
ccc