常见一级指针变量与变量的关系
引言:
在学习C语言过程中,许多朋友对指针模糊不清,也不清楚具体的操作,只能硬着头皮上。下面是笔者对指针的简述,希望能和朋友们一起学习,共同进步!
一、变量
-
变量的含义:用于为变量分配存储空间,还可为变量指定初始值(简而言之,表示空间大小用于存放数据);
-
变量定义的一般形式: 数据类型 变量名;
例如 :
unsigned char A;
unsigned int B;
解析:1.unsigned char \unsigned int 表示A\B变量的存储数据类型
2.A\B表示这个变量的名字,即变量名。
使用方法:比较简单
A = 123;
B = 65535;
空间大小:一般情况下
unsigned char 的存储空间为8bit,即数据范围0-255;
unsigned int的存储空间为16bit,即数据范围0-65535;
- 这里引入取地址运算符:&
A变量存放的是数据,那么在存储空间有对应的地址,假设地址为:
&A = 0X000000;
同样;B变量也有对应的地址。假设地址为
&B = 0X000003;
- 引入间接运算符 *;
每个数据有相应的地址,即每个地址也有相对应的数据,那么分别声明两个地址:
(unsigned char *)(0X000000);
(unsigned int *)(0X000003);
由A = 123; B = 65535;可知:
*(unsigned char *)(0X000000) = 123;
*(unsigned int *)(0X000003) = 65535;
3.因为内存是连续的,这里用一小部分内存大小来做说明,如下
变量名 | A0 | A1 | A… | A10 |
---|---|---|---|---|
变量存储的数据 | 100 | 150 | … | 30 |
变量对应的地址 | 0X000000 | 0X000001 | … | 0X00000A |
表格一
前面第二点说过,每个数据有相应的地址,即每个地址也有相对应的数据。这里对A1进行运算有:
取A1的地址:&A1 = 0X000001;
取地址中存储的数据:*(unsigned char *)0X000001 = 150;
二、指针
1.指针的含义:指针就是指向一个特定内存地址的一个变量。顾名思义,指针变量是一种特殊的变量,存放的是数据的地址,即指针变量表示地址。
2.指针变量定义的一般形式为:基类型 *指针变量名
例如:unsigned char *P;
解析:
1.“*” 表示该变量的类型为指针类型。指针变量名为 P,而不是 *P。
2.那么 P指向unsigned char型一个特定内存地址的变量,表示存储内存地址。
使用方法:
P是指针变量表示内存地址(表示某一数据的地址),而A是普通变量表示数据。它们的性质不一样,即“单位”不一样。那么要想它们数据共享,它们两者必须等价(将单位统一)。如下:
1.这里引入取地址运算符:&
A:是普通变量表示数据;
&A:表示内存中普通变量A数据所在的位置,即A数据的内存地址。
P:是指针变量存储内存地址
有:
P = &A;
//P存储的数据(表示某一数据的地址)变为A数据的内存地址
2.再次引入间接运算符 *
。(注意:这里的*
是运算符号,用于计算。而(unsigned char *P)
中的*
起一个声明的作用,表示这是一个指针。)
P:是指针变量存储内存地址
*P: 表示指向内存地址中存放的数据。
A:是普通变量表示数据;
根据P = &A
有:
*P = A;
//P指向A的数据
3.因为内存是连续的,这里用一小部分内存大小来做说明,如下
指针变量名 | PA0 | PA1 | PA… | PA10 |
---|---|---|---|---|
存储数据(表示地址) | 0X000000 | 0X000001 | … | 0X00000A |
指针变量的地址 | 0X00000B | 0X00000C | … | 0X000014 |
表格二
表中定义:unsigned char *PA0, *PA1, …,*PA16
,我们知道指针变量是一种特殊的变量,同理,指针变量也有自己对应的地址。
由表格二有:PA0存储数据(表示某一数据的地址)为:0X000000,它自身的地址为&PA0 = 0X00000B;
由表格一有:A0的地址0X000000; A0的值为100,
那么满足:PA0 = &A0;
//即PA0的数据表示A0地址,指向A0。也就是证明了PA0是一种特殊变量,存储普通变量的地址。而普通变量存储的是数据。
*PA0 //表示指向0X000000 地址上的数据,
即*PA0 = *(unsigned char *)0X000000 = A = 100 = *(&A);
根据以上推广:
PA10 == &A10 == 0X00000A;
*PA10 == *(&A10)==A10 == * (unsigned char *)0X00000A == 30;
三、总结:
顾名思义,指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是某一数据的地址,即指针变量表示地址。
四、一级指针变量和普通变量的简易应用
void main(void)
{
unsigned char *PA0;
unsigned char A;
unsigned char B;
A = 10; //A的数据为10
B = 20; //B的数据为20
1) PA0 = & A; //指针变量存放普通变量的地址 此时PA0存放A的地址
2) B = *PA0; //因为PA0存放A的地址, 所以*PA指向A的地址上的数据(10)
3) Printf(“B的值等于%d”,B); // 输出结果为10
While(1);
}
描述:
1)通过将A的地址赋值给指针变量PA0,那么PA0的数据就表示A的地址。
2)再使用‘*’间接运算符指向PA0的数据(PA0存放A的地址,即指向A地址上的数据)就得出了A的数据为10
3)输出B的值等于10
作用:可见,指针是操作数据的地址。可以轻易的共享内存数据,使程序更为快速高效。是C语言的灵魂。
2020.09.28 于深圳龙岗