2024年10月22日 09:46

This commit is contained in:
许大仙 2024-10-22 01:46:10 +00:00
parent 9868df316b
commit e4d8e77f98

View File

@ -2052,33 +2052,21 @@ int main() {
} }
``` ```
#### 3.3.2.3 指向常量的指针 #### 3.3.2.3 指针常量
* const 也可以和指针变量一起使用这样可以限制指针变量本身也可以限制指针指向的数据。const 和指针一起使用会有几种不同的顺序,如下所示 * 语法
```c ```c
// 指针常量:指向常量的指针 const int *p1;
// 表示该指针所指向的对象的值不能通过指针修改,但指针本身可以指向其他地址。
const int *p1; // 不能通过该指针去修改指向对象的值。
``` ```
```c ```c
// 指针常量:指向常量的指针 int const *p2;
// 表示该指针所指向的对象的值不能通过指针修改,但指针本身可以指向其他地址。
int const *p2; // 不能通过该指针去修改指向对象的值。
``` ```
```c > [!NOTE]
// 常量指针,常量指针意味着指针本身是常量,不能指向其他地址,
// 但指针所指向的对象的值可以修改。
int* const p3; // 指针的值(即指向的地址)不能改变,但可以通过该指针修改指向对象的值
```
> [!IMPORTANT]
> >
> 技巧: > * ① 指针常量就是指向常量的指针,表示该指针所指向的对象的值是不能通过指针修改的,但是指针本身可以指向其它的地址。
>
> * ① const 离变量名近,就是用来修饰指针变量的,即:`const` 在 `*` 号之后,表示 **指针本身不能改变,但指向的值可以改变**
> * ② const 离变量名远,就是用来修饰指针指向的数据,即: `const` 在 `*` 号之前,表示 **指向的值不能修改,但是指针本身可以修改** > * ② const 离变量名远,就是用来修饰指针指向的数据,即: `const` 在 `*` 号之前,表示 **指向的值不能修改,但是指针本身可以修改**
@ -2093,18 +2081,32 @@ int main() {
// 禁用 stdout 缓冲区 // 禁用 stdout 缓冲区
setbuf(stdout, nullptr); setbuf(stdout, nullptr);
const int a = 10; const int *p; // 或者 int const *p;
const int b = 20; int a = 10;
const int *p1 = &a; int b = 20;
// 错误,不能通过 p1 修改 a 的值
*p1 = 30; // [!code error] p = &a; // 合法:可以改变指针指向
p1 = &b; // 合法:可以让 p1 指向 b // 错误,不能通过指针修改 a 的值
*p = 30; // [!code error]
p = &b; // 合法:可以改变指针指向
return 0; return 0;
} }
``` ```
#### 3.3.2.4 常量指针
* 语法:
```c
int* const p3;
```
> [!NOTE]
>
> * ① 常量指针意味着指针本身是常量,不能指向其他地址,但指针所指向的对象的值可以修改。
> * ② const 离变量名近,就是用来修饰指针变量的,即:`const` 在 `*` 号之后,表示 **指针本身不能改变,但指向的值可以改变**
* 示例: * 示例:
@ -2117,42 +2119,20 @@ int main() {
// 禁用 stdout 缓冲区 // 禁用 stdout 缓冲区
setbuf(stdout, nullptr); setbuf(stdout, nullptr);
const int a = 10; int a = 10;
const int b = 20; int *const p = &a; // p 是常量指针,必须在定义时初始化
int const *p2 = &a;
// 错误,不能通过 p2 修改 a 的值 *p = 20; // 合法:可以通过指针修改 a 的值
*p2 = 30; // [!code error] // 错误,不能改变指针的指向
p2 = &b; // 合法:可以让 p2 指向 b p = &a; // [!code error]
return 0; return 0;
} }
``` ```
3.3.2.5 指向常量的常量
#### 3.3.2.5 指针常量参数
* 示例:
```c
#include <stdio.h>
int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, nullptr);
const int a = 10;
const int b = 20;
int *const p3 = &a;
// 错误,不能通过 p3 的指向
p3 = &b; // [!code error]
*p3 = 30; // 合法:可以修改 a 的值
return 0;
}
```
#### 3.3.2.4 指针常量参数
* 在C语言中单独定义 const 变量没有明显的优势,完全可以使用`#define`命令代替。 * 在C语言中单独定义 const 变量没有明显的优势,完全可以使用`#define`命令代替。
@ -2221,7 +2201,7 @@ int main(){
} }
``` ```
#### 3.3.2.5 深入理解 const 关键字 #### 3.3.2.6 深入理解 const 关键字
* const 关键字修饰的变量const 常量,一旦被定义就必须初始化,后面的任何赋值行为都将发生错误。 * const 关键字修饰的变量const 常量,一旦被定义就必须初始化,后面的任何赋值行为都将发生错误。