C笔记-常量指针与指针常量

作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!

const关键字在C语言中有点名不符实,用它修饰变量结果不是常量而是只读常量,#define定义的才是常量。可参考我的另外一篇文章《C - 编译错误:’XXX’的存储大小不是常量》

const 修饰变量与数组

1、const 修饰变量。

为只读变量,如果修改在编译时会报错。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
const int x = 1;
x = 99; // 编译报错 error: assignment of read-only variable ‘x’
return EXIT_SUCCESS;
}

2、const 修饰数组。

为只读数组,如果修改在编译时会报错。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
const int arr[] = {1, 2, 3};
arr[0] = 99; // 编译报错 error: assignment of read-only location ‘arr[0]’
return EXIT_SUCCESS;
}

const 修饰指针

1、常量指针。

指针指向的内容不可修改,指针可修改。定义常量指针的方式有:

1
2
int const *p = 9;
const int *p = 9;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int x = 10-;
const int *p = &x;
printf("*p=%d\n", *p);
// 通过原来的变量修改指针指向的内容
x = 11; // 修改成功
printf("*p=%d\n", *p);
// 修改指针
int y = 13;
p = &y; // 修改成功
printf("*p=%d\n", *p);
// 通过指针修改内容
*p = 12; // 编译报错 error: assignment of read-only location ‘*p’
printf("*p=%d\n", *p);
return EXIT_SUCCESS
}

2、指针常量。

指针指向的内容可修改,指针不可修改。定义常量指针的方式有:

1
2
int *const p = 9;
int* const p = 9;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int x = 10;
int *const p = &x;
printf("*p=%d\n", *p);
// 通过指针修改内容
*p = 12; // 修改成功
printf("*p=%d\n", *p);
// 修改指针
int y = 13;
p = &y; // 编译报错 error: assignment of read-only variable ‘p’
printf("*p=%d\n", *p);
return EXIT_SUCCESS;
}

3、常量指针+指针常量。

指针与指针指向的内容都不可修改。定义的方式有:

1
2
3
4
const int *const p = 9;
const int* const p = 9;
int const *const p = 9;
int const* const p = 9;