往期回顾
1.【第一章】《认识C语言》
2.【第二章】C语言概述及基本知识1
3.【第二章】C语言概述及基本知识2
4.【第三章】字符串和格式化输入/ 输出
5.【第三章】 printf
6.【第三章】 scanf
7.【第三章】 putchar
8.【第三章】 getchar
9.【第三章】 sizeof
10.【第三章】 strlen
11.【第三章】 define
12.【第四章】运算符第一节
13.【第四章】运算符第二节
14.【第四章】运算符第三节
15.【第四章】运算符第四节
16.【第四章】类型转换
17.【第四章】函数与转化
18.【第五章】while
19.【第五章】for开篇
20.【第五章】for的灵活性
21.【第五章】逗号运算符
22.【第五章】do while
23.【第五章】循环选择
24.【第六章】if
25.【第六章】else if
26.【第六章】break
27.【第六章】continue
28.【第六章】break和continue的区别与作用
28.【第六章】switch
29.【第七章】函数复习
30.【第七章】函数参数
31.【第七章】函数中返回值
32.【第七章】递归
33.【第七章】指针引入
34.【第七章】指针简介
35.【第七章】指针简介2
36.【第八章】数组
37.【第八章】数组2
38.【第八章】多维数组
39.【第八章】指针与数组
40.【第八章】函数 数组 与指针
41.【第八章】使用指针形参
42.【第八章】指针操作
43.【第八章】const入门
const 回顾
我们在前面使用 const 创建过变量:
const double Pl=3.14159;
修饰局部变量:
const int n=5;
int const n=5;
这两种写法是一样的,都是表示变量n的值不能被改变了,需要注意的是,用const修饰变量时,一定要给变脸初始化,否则之后就不能再进行赋值了。
虽然用#define 指令可以创建类似功能的符号常量,但是const 的用法更加灵活。可以创建 const数组、const指针和指向 const的指针。
const int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
如果程序稍后尝试改变数组元素的值,编译器将生成一个编译期错误消息:
days[9]= 44; /*编译错误 */
这分为常量指针和指针常量
最主要看const的位置
// 常量指针
const int * n;
// 指针常量
int const * n;
常量指针
1、常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。
int a[5]={5,2,3,5};
const int* n=&a;
那什么叫不能通过这个指针改变变量的值呢?
// n 指向的 int 类型的值声明为const,这表明不能使用 n 来更改它所指向的值:
*n = 29; // 这样是违法操作
n[2] = 29; // 这样是违法操作
那什么叫可以通过其他的引用来改变变量的值呢?
a[0] = 20; // 允许,因为a 并未被const限定
在举个其他例子:
2、常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。
int a=5;
int b=6;
const int* n=&a;
n=&b;
指向const的指针通常用于函数形参中,表明该函数不会使用指针改变数据。
void show array(const double *ar,int n);
关于指针赋值和 const 需要注意一些规则。首先,把const 数据或非const 数据的地址初始化为指向const的指针或为其赋值是合法的:
然而,只能把非const数据的地址赋给普通指针:
这个规则非常合理。否则,通过指针就能改变const数组中的数据
指针常量
指针常量是指指针本身是个常量,不能在指向其他的地址
需要注意的是,指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改。
int a=5;
int *p=&a;
int* const n=&a;
*p=8;
理解
/*
可以将指针拆分成 如:
*p p &p
结引值 值 地址
这三个部分
常量指针, 指的是整个地址(3部分是个常量),但是他的值还是可以改变的,所以说他的空间是不能变的
指针常量 指的是整个地址(2部分是个常量),但是他的接引值还是可以改变的
如果实在不懂可以再看看这个: