【C语言】const修饰指针的不同作用

简介: 【C语言】const修饰指针的不同作用



const修饰变量

       变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。

       但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。

#include <stdio.h>
int main()
{
int m = 0;
m = 20;//m是可以修改的
const int n = 0;
n = 20;//n是不能被修改的
return 0;
}

       定义了一个整形变量m,m可以被修改值。变量n是定义的整形变量,本质上是整形变量,被const修饰后本质不变,但是语法发生改变,导致n无法被修改,修改会违反语法规则,一旦修改就会报错。

       我们知道变量的值是通过地址存储的,所以我们是否可以通过地址对n进行修改呢?

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

       通过上面示例,我们定义一个指向整形的指针p,并指向n的地址,通过解引用操作符对n处地址的值进行修改,运行后可以发现可以成功运行,并且成功修改了n的值,结果如下

       我们对变量n用const修饰目的就是为了不让n的值改变,如果p拿到n的地址就能修改n,这样就打破了const的限制,这是不合理的,所以应该让p拿到n的地址也不能修改n,那接下来怎么做呢?请看下一个章节进行讲述用const修饰指针变量来进行实现该问题。

 

 

const修饰指针变量

下面通过四个例子对比来得到关于const修饰指针变量的不同方式所得到的不同结论。

①不用const修饰

void test1()
{
int n = 10;
int m = 20;
int *p = &n;
*p = 20;//ok?
p = &m; //ok?
}

运行:

通过运行我们可以发现test1成功运行(最后修改p的指向,指向了m)且通过指针p完成了对n的修改。

 

②const放在*的左边

void test2()
{
//代码2
int n = 10;
int m = 20;
const int* p = &n;
*p = 20;//ok?
p = &m; //ok?
}

运行:

运行后发现无法通过运行。在const在*左边时,意思是指针p指向的n是一个用const修饰的变量,所以通过*p无法对n进行修改。但是可以改变指针p的指向的指向,无报错(如下):

 

③const放在*的右边

void test3()
{
int n = 10;
int m = 20;
int *const p = &n;
*p = 20; //ok?
p = &m; //ok?
}

运行:

同样出现了报错,但是这次的报错行数在p = &m;处,说明当const在*右边时修饰的是指针p,使指针无法改变指向的地址。上一行的*p可以运行无报错说明通过解引用操作符可以改变p指向的变量的值。

④*的左右两边都有const

void test4()
{
int n = 10;
int m = 20;
int const * const p = &n;
*p = 20; //ok?
p = &m; //ok?
}

运行:

运行发现两处均出现报错,现在的指针指向不能改变,指针指向的变量通过指针也不能改变。

int const * const p = &n中,*前面的const使n变成了常变量,使指针也被修饰,导致了这两处报错。

结论

• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本⾝的内容可变。

• const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容(指针指向)不能修改,但是指针指向的内容,可以通过指针改变

目录
相关文章
|
23天前
|
存储 C语言
【C语言基础】一篇文章搞懂指针的基本使用
本文介绍了指针的概念及其在编程中的应用。指针本质上是内存地址,通过指针变量存储并间接访问内存中的值。定义指针变量的基本格式为 `基类型 *指针变量名`。取地址操作符`&`用于获取变量地址,取值操作符`*`用于获取地址对应的数据。指针的应用场景包括传递变量地址以实现在函数间修改值,以及通过对指针进行偏移来访问数组元素等。此外,还介绍了如何使用`malloc`动态申请堆内存,并需手动释放。
|
26天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
1月前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
2月前
|
存储 编译器 C语言
【C语言篇】深入理解指针2
代码 const char* pstr = "hello world."; 特别容易让初学者以为是把字符串 hello world.放 到字符指针 pstr ⾥了,但是本质是把字符串 hello world. 首字符的地址放到了pstr中。
|
2月前
|
存储 程序员 编译器
【C语言篇】深入理解指针1
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。
|
2月前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
2月前
|
C语言
【C语言】指针速览
【C语言】指针速览
18 0
|
2月前
|
编译器
【Bug记录】C2662:不能将this指针从const转换为非const
【Bug记录】C2662:不能将this指针从const转换为非const
|
2月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
2月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)