关于C中const的一些解惑

2018-03-26  本文已影响0人  dongshixiao
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
上一篇下一篇

猜你喜欢

热点阅读