C指针类型转换问题
先看下面的代码:
#include<stdio.h> int main ()
{
int a;
char *x;
x = (char *) &a;
a = 512;
x[0] = 1;
x[1] = 2;
printf("%d\n",a); return 0;
} // 针对x86的处理器来说,其结果为513
原因
程序首先声明了一个int变量,在我的电脑中,此int占用4字节。然后声明了一个x指针,同样,在我的电脑中它占用8字节。然后将a的内存地址赋值给x指针,注意这里用到了类型转换:x=(char *) &a。如果不使用类型转换,x指向的int型的内存单元大小为4字节,如果使用了类型转换,x指向的char型的内存单元大小为1字节。
变量a的值为512,用4个字节的普通二进制表示就是:
00000000 00000000 00000010 00000000
由于x86 CPU的字节序为小端序(最低有效位在最高有效位的前面),所以前面的二进制以小端序的表示方式为:
00000000 00000010 00000000 00000000
操作方式是:先获取最右边的8位数字,然后放到新行的左边;然后获取下一个8位数字,再放到新行的左边,它紧挨着上一个8位数字。以此循环操作,直到数据读取完毕。注意的是一个字节(8位)里的数字顺序是不变的。
x[0]表示指向a内存区域的第一个字节,并设置为1,此时的a内存表示为:
00000001 00000010 00000000 00000000
然后是x[1]设置为2,则a内存表示为:
00000001 00000010 00000000 00000000
然后将a内存转为普通二进制表示方式(方式为从右到左读取):
00000000 00000000 00000010 00000001
最后的结果为:
513
最后修改时间:2018-01-26 19:55
C指针类型转换问题的更多相关文章
- C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像
搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大 ...
- 43.c++指针类型转换
数据类型转换(static_cast) //数据类型转换 printf("%d\n", static_cast<int>(10.2)); 指针类型转换(reinterp ...
- c++ 指针类型转换
1.数据类型转换(static_cast) //数据类型转换printf("%d\n", static_cast<int>(10.2)); 2.指针类型转换(reint ...
- C++_知识点_指针类型转换
#include <iostream> using namespace std; int main(){ ] = {, , , , , , , , , }; int* p = (int*) ...
- C++智能指针类型转换
#include <iostream> #include <memory> struct Base { int a; virtual void f() const { std: ...
- [翻译]类型双关不好玩:C中使用指针重新解释是坏的
原文地址 Type punning isn't funny: Using pointers to recast in C is bad. C语言中一个重新解释(reinterpret)数据类型的技巧有 ...
- 对象布局已知时 C++ 对象指针的转换时地址调整
在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时 ...
- 【面经】【转】C++类型转换
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:type b = (type) a. C++风格的类型转换提供了4种类型转换操作符来应对不同场景的应用. const_cas ...
- C++ 四种强制类型转换
来自csdn:http://blog.csdn.net/hgl868/article/details/46619399 C风格的强制类转换(Type Cast)很简单,不管什么类型的转换统统是: TY ...
随机推荐
- 洛谷 - P2444 - 病毒 - AC自动机
https://www.luogu.org/problemnew/show/P2444 有点恶心,不太明白fail的意义. #include<bits/stdc++.h> using na ...
- 从ao神处偷取的头文件
#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long lo ...
- lightoj 1025【区间DP】
题意: 给出一个word,求有多少种方法你从这个word清除一些字符而达到一个回文串. 思路: 区间问题,还是区间DP: 我判断小的区间有多少,然后往外扩大一点. dp[i,j]就代表从i到j的方案数 ...
- 笔记:JavaScript闭包
闭包 闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰.直观的说就是形成一个不销毁的栈环境. 对于闭包,当外部函数返回之后,内部函数依然可以访问外部函数的变量 ...
- Beta版本冲刺第一天!
该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业地址:https://edu.cnblogs.com/c ...
- C语言归并排序(合并排序)算法及代码
归并排序也称合并排序,其算法思想是将待排序序列分为两部分,依次对分得的两个部分再次使用归并排序,之后再对其进行合并.仅从算法思想上了解归并排序会觉得很抽象,接下来就以对序列A[0], A[l]…, A ...
- WIN7 X64的运行命令窗口
要在WIN7系统下用界面的方式执行运行命令,则可以用如下两种方法方法打开运行对话框.1.点Win+R(run)就能出来的.2.在开始菜单上点右键,选“属性”,进入开始菜单属性设置界面,单击底部的“自定 ...
- android 百度地图
展示当前位置地图 参考百度定位demo (LocationDemo) 实现此功能,运行发现 BDLocationListener 的onReceiveLocation方法无法执行,原因是 Androi ...
- Jmeter之Json Path Extractor 接受上一个请求的响应参数
最近在使用Jmeter进行接口测试,被一个问题困扰了很久,就是第二个请求如何接收上一个请求响应中的参数,刚开始尝试着用网上普遍说的正则表达式,长了了N多次之,都没有达到我想要的效果,被整的够惨,于是, ...
- python之迷宫BFS
# @File: maze_queue_bfs from collections import deque maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0 ...