指针强制类型转换的理解

前几天在判断  值相同的两个指针所指向的变量的值可以不同 ”  这句话时,发现自己对指针类型一些概念仅仅是记住了结论。于是查阅了一些资料,记录一下一些与指针类型和指针类型转化相关的知识。
 

 一些用到的

开始之前,先来复习一些会用到的知识。

1.地址,字节,位

  位(bit)是电子计算机中最小的数据单位。每一位的状态只能是0或1。

  字节(Byte)是用于计量存储容量的一种单位,每一个字节由8位组成(1Byte = 8bit)。

  地址可以理解为在一片内存中,每个字节(Byte)的编号。

  他们在内存中的关系可以比作,内存是一栋大楼,字节(Byte)是大楼中的每一层,地址是楼层编号,位(bit)是每一层中的房间,每一层有8个房间。

   

2.变量的内存

  编译器根据变量的类型,在内存中申请一块空间。例如32位与64位中 int 类型申请到4字节的空间,可理解为编译器申请了4层楼,作为”办公区域“。

3.指针变量

  指针是指程序数据在内存中的地址。在c语言当中,允许用一个变量来存放指针,这种变量称为指针变量。

指针变量类型的作用

  

1 int a;
2 int *p;
3 p = &a;
4 printf("%p %d\n",p,*p);

  以上程序中,”&“操作符取出了变量 a 在内存空间中的首地址,而后通过 “ * ”  操作符取出首地址所在内存空间的数据。

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

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

1     int a;
2     long b;
3     char c;
4
5     int *pa = &a;
6     long *pb = &b;
7     char *pc = &c;

  不管是什么类型的指针变量,所存的值都是地址(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 }

  对应结果为: 

    p1指向:000000000062FE30
    p2指向:000000000062FE30
    p1取出:1
    p2取出:65537

  

    

    根据二进制转换得,10000000000000001 为 65537。由此可验证强制转换前指针读取2字节,转化后读取4字节。两个指针指向的首地址相同,但是读出了不同的结果。

原文地址:https://www.cnblogs.com/al-fajr/p/11615413.html

时间: 2024-11-06 11:23:00

指针强制类型转换的理解的相关文章

结构体指针之间和结构体之间的强制类型转换那些事

结构体指针的强制类型转换在链表的使用中是非常有用的一种方式: (比如我们有一条链表(我们知道每一个链表的节点都是一种结构体),而链表中的每一个节点又是某一个结构体中的成员, 我们就可以通过查询链表的节点,通过将节点强制转换为某个结构体,然后我们就可以方便的使用某个结构体的其他成员了). 那么结构体之间的强制转换又是基于什么的原理实现的呢?需要明白下面几点: 1.结构体声明如何内存的分布,  2.结构体指针声明结构体的首地址,  3.结构体成员声明该成员在结构体中的偏移地址 举个例子: typed

C/C++强制类型转换、指针类型转换发生了什么

(1)强制类型转换 强制类型转换是对变量对应的内存里面的0和1按照新的类型进行重新解释的过程 代码: #include <iostream> using namespace std; int main(int, char *[]) { char c = 0xA0;//0xA0 [-128~127] 最高位为1表示负数 0xA0 = 1010 0000 = -96 //高位补0 0xA0->0xFF FF FF A0 = 0000 0000 0000 0000 0000 0000 1010

C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整型数据的指针类型,后赋给p 注示:类型说明符和表达式都必须加括号,表达式为单个变量可不加括号. 总结:只要看到(类型说明符) (表达式) 的一定为强制类型转换:如(int *) 0x0022; 再举一例:#define DIR *((volatile unsigned int *) 0x0022)

详细理解javascript中的强制类型转换

将值从一种类型转换为另一种类型通常称为类型转换,这是显式的情况:隐式的情况称为强制类型转换,JavaScript 中的强制类型转换总是返回标量基本类型值,如字符串.数字和布尔值. 如何理解: 类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时? 1.如果是静态语言,比如c等,所有的类型转换应该都是在编译阶段处理的吧? 2.如果是动态语言,如js等, 编译阶段会处理类型转换吗? 一.ToString 它负责处理非字符串到字符串的强制类型转换 数字的字符串化遵循通用规则

深入理解计算机系统 练习题2.25-隐式强制类型转换导致的数组越界

1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 5 float sum_elements(float a[], unsigned length) { 6 int i; 7 float result = 0; 8 cout << length << endl; 9 cout << length - 1 << endl; 10 for (i = 0;

指针、数组的理解与关系

一.指针的本质:变量,指针变量就是指针变量int *p:两个变量,一个p(指针变量本身)是int *类型的 另一个是*p(指针指向的那个变量)是int类型的注:指针说白了就是指针类型,前面定义的int类型是为了说明指针指向的那个数的类型,所以指针的解析方式都是按地址来解析的(不管你是char *还是double *,解析方式都是地址)而指向的那个数的类型就要看你怎么定义的了例如:int *aa是按照地址来解析的:*a则是按照int类型来解析的. (1)所有的类型的数据存储在内存中,都是按照二进制

c++的四种强制类型转换

http://hb.qq.com/a/20110722/001452.htm ...... C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast,字面上理解就是去const属性或volatile属性. static_cast,命名上理解是静态类型转换.如int转换成char. 类似于C风格的强制转换.无条件转换,静态类型转换.用于: 1. 基类和子类之

C++中4种强制类型转换

不过为了完成强制类型转换,C++中已经为我们提供了4中标准方法,它们是dynamic_cats, static_cast, const_cast, reinterpret_cast,用法形式为:dynamic_cast<类型说明符>(表达式),之所以分成4类,就表示他们各自有着不同的使用环境,下面转载的文章会有详细的说明. const_cast,字面上理解就是去const属性.static_cast,命名上理解是静态类型转换.如int转换成char.dynamic_cast,命名上理解是动态类

C++开发必看 四种强制类型转换的总结

C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast,字面上理解就是去const属性. static_cast,命名上理解是静态类型转换.如int转换成char. dynamic_cast,命名上理解是动态类型转换.如子类和父类之间的多态类型转换. reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换. 4种类型转换的格式,