C语言的 指针的数据类型----指针类型的思想,指针类型转换的思想对数据处理简化但容易出错

存储变量的内存,是由多个字节组成。而指针变量在只知道首地址(第一个字节的地址)的情况下,就能找到a的内存区域。它是怎么做到的?先来看看指针变量的声明。

  我们在声明一个指针变量的时候,会根据它将要指向的变量类型,声明对应的类型,例如:

    int a;
    long b;
    char c;

    int *pa = &a;
    long *pb = &b;
    char *pc = &c;

  不管是什么类型的指针变量,所存的值都是地址(int类型的值)。那么声明不同类型的作用是什么?答案是规定指针在内存中每次移动的字节数。

  例如定义“int *pa = &a”,取值时,int类型占4个字节,指针就从首地址开始移动,读取4个字节。同理,short类型占2字节,指针就移动2字节。通过声明指针类型,告诉指针每次移动多少字节,来获取变量的值。

不管是什么类型的指针变量,所存的值都是地址(int类型的值)。那么声明不同类型的作用是什么?答案是规定指针在内存中每次移动的字节数。

  例如定义“int *pa = &a”,取值时,int类型占4个字节,指针就从首地址开始移动,读取4个字节。同理,short类型占2字节,指针就移动2字节。通过声明指针类型,告诉指针每次移动多少字节,来获取变量的值。

值相同的两个指针所指向的变量的值可以不同

  “值相同的两个指针变量”,意思是两个指针变量指向同一个首地址。但是如果指针变量的类型不同,因为指针移动的字节数量不同,就可能读取出不同的数据。

  要实现不同类型指针变量指向同一个地址,需要使用指针类型转换。

1     short a = 1;
2     short *p1 = &a;
3     int *p2 = (int *)p1;
4     printf("%d %d",*p1,*p2);

   以上例子将一个每次移动读取2字节的 short 类型指针变量,转化为一个每次读取4字节的int型指针变量。

   接下来,我们通过指针类型转换,用同一个首地址,取出不同的值。

复制代码

 1 #include <stdio.h>
 2 int main()
 3 {
 4     short c[2];               //等价于申请2个连续的内存空间,每个空间2字节 
 5     c[0] = 1;                //为第一个short空间赋值为1 
 6     c[1] = 1;                //为第二个short空间赋值为1 
 7     short *p1 = c;            //p1指向c[]首地址 
 8     int *p2 = (int *)p1;      //p2指向c[]首地址,并强制转换类型为 int 
 9 
10     printf("p1指向:%p\np2指向:%p\n",p1,p2);      
11     printf("p1取出:%d\np2取出:%d\n",*p1,*p2);
12     return 0;
13 }
14         
发布了67 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42544051/article/details/104908451
今日推荐