打印
[Beagle Bone]

C语言笔记 - 一级指针变量与变量的关系

[复制链接]
542|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
黄大队长|  楼主 | 2020-9-28 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 黄大队长 于 2020-9-28 17:18 编辑

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   常见一级指针变量与变量的关系
引言:
在学习C语言过程中,许多朋友对指针模糊不清,也不清楚具体的操作,只能硬着头皮上。下面是笔者对指针的简述,希望能和朋友们一起学习,共同进步!

一、变量
1.  变量的含义:用于为变量分配存储空间,还可为变量指定初始值(简而言之,表示空间大小用于存放数据);
2.  变量定义的一般形式: 数据类型 变量名;
例如 :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;
1.    这里引入取地址运算符:&
  A变量存放的是数据,那么在存储空间有对应的地址,假设地址为:
  &A = 0X000000;
同样;B变量也有对应的地址。假设地址为
&B = 0X000003;
2.    引入间接运算符 *;
每个数据有相应的地址,即每个地址也有相对应的数据,那么分别声明两个地址:
(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;
取地址中存储的数据:*(unsignedchar *)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;
根据以上推广:
         PA10 == &A10 == 0X00000A;
           *PA10 == 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
                                                                                                                                    于深圳龙岗  


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝