小甲鱼 P27 常量和指针
常量:520,'a',3.14,#define PI 3.14
常量的值不可以改变,变量的值可以改变。
使用const关键字修饰,可以将变量 变成 具备常量的特性。(把变量变成只读,而不能写入)
#include <stdio.h>
int main()
{
const float pi = 3.14;//这个变量已经失去写入修改的功能,只能只读
printf("%f\n", pi);
// pi = 3.14259;//错误
return 0;
}
指向常量的指针
#include <stdio.h>
int main()
{
int num = 520;
const int cnum = 880;//失去了可修改的属性,只能读
const int *pc = &cnum; //指向常量的指针
printf("cnum: %d, &cnum: %p\n", cnum, &cnum);
printf("*pc: %d, pc: %p\n", *pc, pc);
// *pc = 1024;//错误
pc = #//修改指针本身的指向,num不是const修饰的变量
printf("cnum: %d, &cnum: %p\n", num, &num);
printf("*pc: %d, pc: %p\n", *pc, pc);
// *pc = 1024//错误
num = 1024;
printf("*pc: %d, pc: %p\n", *pc, pc);
return 0;
}
总结:
常量指针
指向非常量的常量指针
#include <stdio.h>
int main()
{
int num = 520;
const int cnum = 888;
//常量指针,指针是常量(指针本身不能改变,但是指向的值可以改变)
int * const p = #
*p = 1024;
printf("*p: %d\n", *p);
// p = #//错误,自身的值不能改变
printf("*p: %d\n", *p);
return 0;
}
指向常量的常量指针
#include <stdio.h>
int main()
{
int num = 520;
const int cnum = 888;
//指向常量的常量指针
const int * const p = &cnum;//前面的const,代表的是const int
// *p = 1024;//错误,指向的值不能修改
printf("*p: %d\n", *p);
// p = #//错误,自身不可以修改
printf("*p: %d\n", *p);
return 0;
}
总结:const靠近谁,就修饰谁不能改变的,const int * const p,第一个const修饰int,代表指针所指向的值不能改变。第二个const修饰指针变量p,所以指针变量本身不能改变。
指向 "指向常量的常量指针" 的指针
这是换汤不换药的把戏
#include <stdio.h>
int main()
{
int num = 520;
const int cnum = 888;
//指向常量的常量指针
const int * const p = #//前面的const,代表的是const int
//指向 "指向常量的常量指针" 的指针
const int * const *pp = &p;
// *p = 1024;//指向的值不能修改
// printf("*p: %d\n", *p);
// p = #//自身不可以修改
// printf("*p: %d\n", *p);
printf("pp: %p, &p: %p\n", pp, &p);
printf("*pp: %p, p: %p, &num: %p\n", *pp, p, &num);
printf("**pp: %d, *p: %d, num: %d\n", **pp, *p, num);
return 0;
}