const型变量:
1.被const关键字修饰的变量具有只读属性
2.必须在定义的同时初始化
不可修改!
当const作用于指针
常量指针
指针变量保存的地址可以改变,指向的对象的内存值不能修改
const int* 或 int const*
常量指针常作为函数的输入参数,在避免值复制传递参数开销的同时,有效防止在函数中意外地修改实参
指针常量,
指针变量保存的地址不可修改,但内存值可以修改
int* const
数组名就是指针常量
arr++ //不可以,*(arr + i) = 5; //可以修改内存
常量指针常量,
指针的目标和指针本身都只读
const int* const或者 int const*const
示例:
//const关键字演示
#include <stdio.h>
int main(void) {
//1.修饰普通变量
const int a = 1314; //a以后就是一个常量了,只能查看不能修改,但是必须要初始化
//a = 250; //不可以
printf("%d\n", a); //可以
//2.常量指针:此指针变量保存的地址可以修改,但是指向的内存值不允许修改
int b = 520;
const int *p = &b; //定义初始化常量指针,p指向的内存b的值不允许修改
//等价于:int const *p = &b;
//*p = 250; //不可以
printf("%d\n", *p); //可以
int c = 521;
p = &c; //让p来保存的首地址,指向c,可以
//*p = 250; //不可以
printf("%d\n", *p); //可以
//3.指针常量:此指针变量保存的地址不允许修改,但是指向的内存数据可以修改
int d = 522;
int* const p1 = &d; //定义初始化指针常量,p永远只能指向d
*p1 = 523; //可以修改
//p = &c; //不允许修改指向
printf("%d\n", *p1); //可以
//4.常量指针常量:此指针变量保存的地址不能修改并且指向的内存值也不能修改
int e = 520;
const int * const p2 = &e; //p2只能指向e并且通过p2不能修改e
//*p2 = 521; //不可以
//p2 = &d; //不可以
printf("%d\n", *p2); //可以
return 0;
}
题目:
int a = 0x12345678; //分配4字节内存
前提:数据的低位放到内存的低地址,高位放到高地址,利用指针如何访问到其中任意1字节或2字节或4字节数据?
//pointer.c:通过有类型指针访问任意大小的内存空间
#include <stdio.h>
int main(void) {
int a = 0x12345678;
//1.通过有类型指针访问其中任意1字节数据
char *p1 = (char *)&a;//将int类型的指针&a强转为char类型的指针赋值给p1,p1保存a的首地址
printf("%#x\n", *p1++); //0x78
printf("%#x\n", *p1++); //0x56
printf("%#x\n", *p1++); //0x34
printf("%#x\n", *p1++); //0x12
//2.通过有类型指针访问其中任意2字节数据
short *p2 = (short *)&a;//将int类型的指针&a强转为short类型的指针赋值给p2,p2保存a的首地址
printf("%#x\n", *p2++); //0x5678
printf("%#x\n", *p2++); //0x1234
//3.通过有类型指针访问其中任意4字节数据
int *p3 = &a;
printf("%#x\n", *p3); //0x12345678
//4.修改任意1字节
p1 = (char *)&a; //让p1重新指向a的首地址
*p1++ = 0x12; //0x78->0x12
*p1++ = 0x34; //0x56->0x34
*p1++ = 0x56; //0x34->0x56
*p1++ = 0x78; //0x12->0x78
//打印验证
printf("%#x\n", *p3); //0x78563412
//问:如何打印其中0x5634这两个字节数据呢?一条语句拿下
printf("%#x\n", *(short *)((char *)&a + 1)); //黑客
return 0;
}
通过无类型指针:
//pointer2.c:通过无类型指针访问任意大小的内存空间
#include <stdio.h>
int main(void) {
int a = 0x12345678;
void *p = &a; //p保存a的地址
//1.通过无类型指针访问其中任意1字节数据,间接法
char *p1 = (char *)p;//将无类型的指针p强转为char类型的指针赋值给p1,p1保存a的首地址
printf("%#x\n", *p1++); //0x78
printf("%#x\n", *p1++); //0x56
printf("%#x\n", *p1++); //0x34
printf("%#x\n", *p1++); //0x12
//直接法
printf("%#x\n", *(char *)(p+0)); //0x78
printf("%#x\n", *(char *)(p+1)); //0x56
printf("%#x\n", *(char *)(p+2)); //0x34
printf("%#x\n", *(char *)(p+3)); //0x12
//2.通过无类型指针访问其中任意2字节数据
short *p2 = (short *)p;//将无类型的指针p强转为short类型的指针赋值给p2,p2保存a的首地址
printf("%#x\n", *p2++); //0x5678
printf("%#x\n", *p2++); //0x1234
//直接法
printf("%#x\n", *(short *)(p+0)); //0x5678
printf("%#x\n", *(short *)(p+2)); //0x1234
//3.通过有类型指针访问其中任意4字节数据
int *p3 = (int *)p;
printf("%#x\n", *p3); //0x12345678
printf("%#x\n", *(int *)p);
//修改任意1字节或者2字节或者4字节数据
return 0;
}