C语言指针--指针中的const

简介: C语言指针--指针中的const

前言


var code = “47f56ed3-1701-4c13-a755-19dd0f5d101e”

这一章讲一个对指针和 const 之间的结合。


一、const


1.什么是const


const是C语言中的一种修饰符,和宏定义一样,只要定义了该变量就不能再改变了。


2.const的使用


const type variate = value;
  • type:类型
  • variate:变量名
  • value:值

const 修改后的变量的值不能对它在进行赋值了,例如下面的代码


#include <stdio.h>
int main(){
  const int a = 5;
  a = 6;
  return 0;
}


编译后


可以发现没有办法对被 const 修饰后的变量进行修改。


二、const修饰一级指针


const 放在变量中是很简单的,如果将 const 放在指针中的情况会很复杂,现在来一一讲解。


1.const放在 * 左边


#include <stdio.h>
int main(){
  int a = 5, b = 10;
  const int* pa = &a;
  return 0;
}


这种情况是让指针变量pa中的内容不改变,而地址可以改变。

比如对pa的地址进行改变


#include <stdio.h>
int main(){
  int a = 10, b = 20;
  const int* pa = &a;
  pa = &b;
  printf("%d\n", *pa);
  return 0;
}


运行的结果

如果对pa地址对应的内容进行修改


#include <stdio.h>
int main(){
  int a = 10, b = 20;
  const int* pa = &a;
  *pa = b;
  printf("%d\n", *pa);
  return 0;
}


会出现错误

所以当const放在*左边时,只能对指针变量存放的地址进行修改,但不能对地址对应内容呢进行修改。


2.const在*右边

#include <stdio.h>
int main(){
  int a = 5, b = 10;
  int* const pa = &a;
  return 0;
}


还是和上面的使用一样

重新赋值内容


#include <stdio.h>
int main(){
  int a = 5, b = 10;
  int* const pa = &a;
  pa = &b;
  return 0;
}


会发现没法通过编译,因为 const* 的右边是修饰指针变量的,让指针变量里面的内容不发生改变

三、const修饰二级指针


1.const修饰**前


#include <stdio.h>
int main(){
  int a = 5, b = 10;
  int* pa = &a;
  int* pb = &b;
  const int ** ppa = &pa;
  **ppa = 28;
  return 1;
}


const 修饰在 ** 前修饰的内容是 **ppa ,也就是 **ppa 中所对应的内容不会被修改,所以第7行语句会报一个错误


c5a3d25f927e4647a0e9eaf2534ab983.png

但这里会发现存在一个警告,因为二级指针中的一级指针不是使用 const 的进行修饰,所以为了解决这个问题,需要在一级指针前面添加一个 const 进行修饰。


#include <stdio.h>
int main(){
  int a = 5, b = 10;
  const int* pa = &a;
  int* pb = &b;
  const int ** ppa = &pa;
  **ppa = 28;
  return 1;
}


这样就不存在警告了。


2.const修饰**中间


#include <stdio.h>
int main(){
  int a = 5, b = 10;
  int* pa = &a;
  int* pb = &b;
  int * const * ppa = &pa;
  *ppa = &b;
  return 1;
}


const 修饰在 ** 中间,本质上修饰 *ppa 中的内容,如果改变 *ppa 中存放的地址,会报错


3.const修饰**右边


#include <stdio.h>
int main(){
  int a = 5, b = 10;
  int* pa = &a;
  int* pb = &b;
  int** const ppa = &pa;
  ppa = &pb;
  return 1;
}


这修饰的是 ** 右边的内容,也就是修饰 ppa ,所以 ppa 中的内容是不能被修改的


7922b27de6b74be39e9e29b690bbba65.png


总结


const 对于指针的修饰情况有很多,级数越高的指针,产生的全款就会越多,所以一般都只考虑 const 到二级指针的情况,更高级的指针不会考虑。


目录
相关文章
|
19天前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
4天前
|
编译器 C语言
【C语言初阶】指针篇—下
【C语言初阶】指针篇—下
|
4天前
|
存储 C语言
【C语言初阶】指针篇—上
【C语言初阶】指针篇—上
|
14天前
|
搜索推荐 程序员 C语言
指针赋值与引用传递:C语言的基础知识与实践技巧
指针赋值与引用传递:C语言的基础知识与实践技巧
|
13天前
const修饰指针
const修饰指针
7 0
|
13天前
|
搜索推荐 程序员 C语言
指针赋值与引用传递:C语言的基础知识与实践技巧
指针赋值与引用传递:C语言的基础知识与实践技巧
|
17天前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
19 0
|
18天前
|
C语言
C语言中的函数指针、指针函数与函数回调
C语言中的函数指针、指针函数与函数回调
11 0
|
18天前
|
存储 C语言
C语言中的多级指针、指针数组与数组指针
C语言中的多级指针、指针数组与数组指针
12 0