// age1age2是常量,只读,下面两个写法是相同的
const int age1 = 20;
int const age2 = 30;
// const的修饰的*p1和*p2,*p1和*p2是常量,不能通过p1、p2指针间接修改其他变量的值,下面p1和p2的写法相同
const int *p1 = &age;
int const *p2 = &age;
int num = 30;
p1 = #
p2 = #
// 写法错误 *p1 = 40;
// 写法错误 *p2 = 50;
// const修饰的p3,p3是个常量,p3不能再指向其他变量
int * const p3 = &age;
// 写法错误
// int num = 30;
// p3 = #
// 写法正确
// *p3 = 30;
#include <stdio.h>
/*
const 使用地方
1)修饰变量
2)修饰指针变量
3)修饰数组
*/
/**
* const修饰变量,使得变量变成常量
*/
void test1()
{
// 使用const修饰变量a
const int a = 10;
printf("a = %d
", a); // 10
// a = 20; // read-only
printf("a = %d
", a);
}
/**
* 用指针强制修改const常量
*/
void test2()
{
// 使用const修饰变量a
const int a = 10;
printf("a = %d
", a); // 10
int *p = &a;
*p = 100; // 强制修改常量
printf("a = %d, *p = %d
", a, *p); // 10,100
}
int main(int argc, const char * argv[]) {
int a = 10;
int b = 20;
// 定义个指针变量,p指向a
// 此处的const的作用是指针变量p的指向可以改变,但是指向的变量的值
// 不能改变
// 1.const修饰的指针变量指向可变,指向的变量的值不可变
const int *p = &a; // 给p初始化
p = &b; // 重新修改了p的指向
// *p = 100; // 错误写法
int const *p1 = &a;
p1 = p; // p1的指向也是可以改变的
// *p1 = 100; // p1指向的变量的值时不能改变的
// 2.const修饰的指针变量,指针变量指向的变量值可以改变,指向不能变
int * const p2 = &a;
*p2 = 100; // 值可以改变
// p2 = &b; // p2的指向不能变
// 3.const修饰的指针变量的指向和值,都不能改变
const int * const p3 = &a;
// p3 = &b; // 指向不能变
// *p3 = 100; // 指向的变量的值也不能变
printf("a = %d
", a);
/**
记忆技巧:
看 const 和 * 的位置
如果 const 在 *的左侧 表示指针变量指向的变量的值不能变,但是指向可以改变
如果 const 在 *的右侧 表示指针变量指向的变量的值可以改变,但是指向不就可以改变
如果 const 出现在 *的两侧,表示指针变量的指向和值都不能改变
*/
return 0;
}