c语言常量:常量指针-指针常量-常量指针常量
程序员文章站
2023-12-27 08:28:51
...
**
一:常量
**
常量指针,指针常量,常量指针常量
a)常量定义:不可修改的值,例如250,’A’
b)const关键字功能:将变量常量化,四种形式
(1)const可以修饰普通变量,一旦修饰该变量,该变量就当做常量看待,不可再更改
Const int a=250;//将变量a常量化
A=200;//gcc编译器报错
(2)常量指针:不能通过指针变量来修改指向的内存区域的数据,主要目的是保护数据不可篡改
例如 int a=250;
Const int *pa=&a;//定义初始化一个常量指针
或者 int a=250;
Int const *pa=&a; //定义初始化一个常量指针
*pa=200;//gcc编译报错
Printf(“a=%d\n”,*pa);//可以查看
int b=300;
pa=&b;//pa重新指向b变量,可以修改指针变量本身保存的地址
*pa=400;//gcc编译报错
(3)指针常量(不太用)
指针永远指向一块内存区域,不能再指向别的内存,但是可以修改指针内存的值
例如:
int a=100;
int * const pa=&a;//定义指针常量
*pa=300;//可以
printf("a=%d\n",*pa);
int b=200;
*pa=&b;//不可以,gcc报错
printf("a=%d\n",*pa);
(4)常量指针常量:指针本身和指向的内容都不可修改
**
二、无数据类型指针:void *
**
经典指针操作案列
int a=0x12345678;
int *p=&a;
printf("%#x\n",*p);//获取4个字节数据并且按照十六进制打印输出
4个字节,十六进制每两个数字是一个字节,左是高字节,右是低字节
**
如何做到操作访问4字节中的 某1个字节或者某2个字节数据呢?
**
操作方式:
方式1:采用有数据类型指针来获取1字节,2字节(可复制 代码在后面)
方式2:采用无类型指针void*来获取1字节,2字节,4字节(可复制的代码在后面)
两种方式代码如下:
方式1代码
#include<stdio.h>
int main()
{
int a=0x12345678;
//1、一次性获取4字节数据
int *p=&a;
printf("a=%#x\n",*p);//一次性获取全部四字节数据
printf("**************\n");
//利用有数据类型指针来获取1字节,2字节数据
//2、获取一字节数据
char *p1=(char *)&a;//将a的int型指针强制转化为char类型的指针
printf("a=%#x\n",*p1++);//0x78
printf("a=%#x\n",*p1++);//0x56
printf("a=%#x\n",*p1++);//0x34
printf("a=%#x\n",*p1++);//0x12
printf("**************\n");
//3、获取2字节
short *p2=(short *)&a;//将a的int型指针强制转化为short类型的指针
printf("a=%#x\n",*p2++);//0x5678
printf("a=%#x\n",*p2++);//0x1234
}
方式2代码
#include<stdio.h>
int main()
{
int b=0x12345678;
void *p3=&b;
//1、获取1字节数据
char *p4=(char *)p3;
printf("%#x\n",*p4++);//打印方式1
printf("%#x\n",*p4++);
printf("%#x\n",*p4++);
printf("%#x\n",*p4++);
printf("%#x\n",*(char *)(p3+0));//打印方式2(也可以直接强转)
printf("%#x\n",*(char *)(p3+1));
printf("%#x\n",*(char *)(p3+2));
printf("%#x\n",*(char *)(p3+3));
printf("************************\n");
//2、获取两字节
short *p5=(short *)p3;
printf("%#x\n",*p5++);
printf("%#x\n",*p5++);
printf("%#x\n",*(short *)(p3+0));
printf("%#x\n",*(short *)(p3+2));
printf("************************\n");
//3、获取字节
int *p6=(int *)p3;
printf("%#x\n",*p6);
printf("%#x\n",*(int *)p3);
}