const修饰符相关

时间:2024-08-31 14:34:32

const修饰符相关

const修饰符表明一个变量是常量,大致分为三类:常量数组(等同于常量指针),常量指针,指向常量的指针。

  • 常量数组中数据都是不可修改的,任何试图修改常量数组中的数据的操作都会报错。

  • 常量指针,指针本身是常量,是不可以修改它的指向的,但是可以修改它指向变量的数值,它的修饰符一般放在中间,形如:int* const p

  • 指向常量的指针,指针用于指向常量,因为常量具有不可修改的特点,所以任何希望通过普通指针来指向常量然后来修改常量的行为是非常恶劣的。所以如果想指向常量,就要通过指向常量的指针,形如:const int *p

常量指针和指向常量指针的辨析

常量指针只能指向对应类型的非常量的变量,可以通过解引用来修改它指向数据的值,但是不可以修改它的指向。注意:指向const的指针中*必须放在类型说明符后面,形如int *const a;

 #include <stdio.h>
 ​
 int main (void) {
  int a = 4;
  int b = 5;
  const int c = 6;
  int* const d = &a;
 //   d = &b; 这个是会报错的因为d是const指针不可以指向其他地方
  printf("d = %d\n", *d);
  *d += 10;
  printf("d = %d\n", *d);
  return 0;
 }
 ​
 /**
 d = 4
 d = 14
 **/

指向常量的指针,就像它的定义一样,默认来看它使用来指向常量的,因为常量的不可修改性,我们不希望通过普通的指针来指向常量来达到修改常量的效果,所以我们使用指向常量的指针。

指向常量的指针不能通过它来修改被指向的对象,只能通过它来访问对应常量的内容,而且因为指针本身并非常量,他自身也可以被修改指向其他对象。而且由于语言的宽泛性,指向常量的指针也可以指向非常量,这样我们也不一定通过它来修改被指向的非常量。

 #include <stdio.h>
 ​
 int main (void) {
  int a = 4;
  int b = 5;
  const int c = 6;
 ​
  // 常量指针可以指向可以指向非常量和常量,但是都可以访问但是不可以修改
  const int *d = &c;
  printf("d = %d\n", *d);
  // *d += 1;这个会报错
  d = &a;
  printf("d = %d\n", *d);
  // *d += 2; 这个也会报错
 ​
  // 普通指针不可以指向常量!企图通过这种方式修改常量的行为时未定义的,一般不可使用
  int *e = &c;
  printf("e = %d\n", *e);
  *e += 2;
  printf("e = %d", *e);
  return 0;
 }
 ​
 /**
  d = 6
  d = 4
  e = 6
  e = 8
 **/