(C/C++学习)23.C++中指针的长度
引言:先看下面一个程序会打印出什么?
#include<iostream>
using namespace std;
int main()
{
int a = 2; int *p = &a;
double b = 1; double *q = &b;
float c = 3; float *l = &c;
char d = 's'; char *s = &d; cout << sizeof(a) << "" <<sizeof(p) << endl;
cout << sizeof(b) << "" << sizeof(q) << endl;
cout << sizeof(c) << "" << sizeof(l) << endl;
cout << sizeof(d) << "" << sizeof(s) << endl;
return 0;
}
64 位Linux 下测试结果:
4 8
8 8
4 8
1 8
64 位Windows下测试结果:
4 4
8 4
4 4
1 4
好奇的人可以自己去测试结果,这里留点悬念!我只告诉你不同的电脑、不同的编译器都有可能得出不一样的结果。为什么呢?请往下看:
首先:
1. 操作系统有32/64位之分,但同时CPU也有32/64位之分(Windows 在cmd终端下用 systeminfo 命令可以查看自己的操作系统以及cpu位数);
2. 32位CPU只能安装32位系统,64位CPU可以安装32位操作系统,也可以安装64位操作系统;
3. 一般来说,在64位系统下,指针长度为8,32位系统下,指针长度位4;但是有的编译器为了不同的操作系统之间相互兼容,内部对指针进行了包装,使得不管在64位还是32位系统下,指针都是4个字节长度。
4. 64位系统,这个位数指的是CPU里面的通用寄存器的数据宽度为64位,也就是说一个地址占二进制位数是64,而指针其实是一个地址,所以:
sizeof(double *)==sizeof(int *)==sizeof(char *)==64/8==8
这里除以8是因为,我们用sizeof()计算的是某个数据类型所占的字节个数,用此字节个数来表示这个数据类型的大小 ,而我们都知道,一个字节所占的二进制位为8位,因此才除以8.
5. 32位系统,同理,一个地址占32位二进制空间,sizeof(double *)==sizeof(int *)==sizeof(char *)==32/8==4
注意:地址艮系统的位数有关,但是基本的数据类型所占字节数(大小)是由C语言本身决定的,如:int 就只占4个字节,char 就只占一个字节,与系统无关。
(C/C++学习)23.C++中指针的长度的更多相关文章
- Python学习-23.Python中的函数——isinstance
在Python中可以使用isinstance函数来判断某个值或变量是否为某个类型. 例子: print(isinstance(1,int)) print(isinstance(1,float)) pr ...
- 《挑战30天C++入门极限》c++中指针学习的两个绝好例子
c/c++中指针学习的两个绝好例子 对于众多人提出的c/c++中指针难学的问题做个总结: 指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多 ...
- VC++学习之VC中常见问题
VC++学习之VC中常见问题 (1)为什么某个类突然在工作区间里面突然看不见了? 只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了 ( ...
- C语言学习004:数组与指针
在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的
- C++中指针常量和常量指针的区别
在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的. 本文即是简单描述指针常量和常量指针的区别. 常量指针 定义: 又叫 ...
- Keil C51 中指针的使用
指针是C语言中比较难的一个内容,Keil C51在指针方面有和标准C不一样的地方,今天看了一些资料学习了一下Keil C51 中指针的使用. keil51的指针,包含两种指针:普通指针,兼容标准C:内 ...
- Javascript学习1 - Javascript中的类型对象
原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...
- C中指针符*和取址符&
学习了C语言之后,关于指针部分看了无数遍,有时候明明觉得自己看懂了,指针就是地址,但是总是在看代码时候糊里糊涂的搞不明白,最近又关于指针强化了一把. 大部分情况下对于程序中指针糊涂是因为不明白指针符“ ...
- 【AI in 美团】深度学习在OCR中的应用
AI(人工智能)技术已经广泛应用于美团的众多业务,从美团App到大众点评App,从外卖到打车出行,从旅游到婚庆亲子,美团数百名最优秀的算法工程师正致力于将AI技术应用于搜索.推荐.广告.风控.智能调度 ...
随机推荐
- Flask开启多线程、多进程
一.参数 app.run()中可以接受两个参数,分别是threaded和processes,用于开启线程支持和进程支持. 二.参数说明 1.threaded : 多线程支持,默认为False,即不开启 ...
- Python 返回多个值+Lambda的使用
def MaxMin(a,b): if(a>b): return a,b else: return b,a max,min=MaxMin(8,95) print "最大值为:" ...
- UVaLive 6680 Join the Conversation (DP)
题意:给出n条发言,让你求最大的交流长度并输出标记顺序. 析:这个题要知道的是,前面的人是不能at后面的人,只能由后面的人at前面的,那就简单了,我们只要更新每一层的最大值就好,并不会影响到其他层. ...
- (DP)51NOD 1049 最大子段和
N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值.当所给的整数均为负数时和为0. 例如:-2,11,-4,13,-5 ...
- jSignature做手动签名,canvas支持触摸屏的签名涂鸦插件
整理的前面可以用的: <!doctype html> <html lang="en"> <head> <meta charset=&quo ...
- oozie timezone时区配置
cloudera oozie默认时区是UTC,在开发oozie任务时必须在期望执行的时间上减去8小时,很不习惯.记录下修改时区的配置操作. 1. cloudera oozie配置—>Oozie ...
- Visual Studio Code 扩展工具集,记录
编码 提高效率及校验 Auto Close Tag 自动闭合标签 Auto Rename Tag 自动更改HTML/XML标签,不需要再进行二次修改,减少50%的工作量! Path Intellise ...
- Vue知识点小总结1
ES6常用语法 变量的定义 let定义变量 不会变量提升 有全局作用域和函数作用域,块级作用域{} 不能重复定义 var定义变量 会变量提升 只有全局作用域和函数作用域 能够重复定义 const定义变 ...
- [转]C语言常见错误总结1
指针与数组的对比c程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地 ...
- Android 性能优化(24)*性能工具之「Traceview,dmtracedump」Profiling with Traceview and dmtracedump :记录并查看函数调用栈*
Profiling with Traceview and dmtracedump In this document Traceview Layout Traceview工具界面介绍 T ...