鱼C论坛

 找回密码
 立即注册
查看: 1856|回复: 0

[技术交流] C++(8th)

[复制链接]
发表于 2021-2-5 22:26:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一叶枫残 于 2021-2-8 18:04 编辑

对于下行代码一定要记一下:
int *p1,p2,p3;
被定义为指针的只有p1,p2与p3被定义为整型变量;
如果不想写3个*,你可采用类型定义(注意不是宏定义,编译会报错的),如下
typedef int* point_int;
point_int p1,p2,p3;

对齐:在C++里面,变量类型是根据它们的自然边界进行对齐的;对齐问题会因为系统平台不同而不同。(了解就好)
看如下:
#include <iostream>

using namespace std;

typedef int* point_int;

int main()
{
        int a;
        int b;
        char c='b';
        int d;
        
        point_int p1,p2,p3;
        char *pc;
        
        p1 = &a;
        p2 = &b;
        p3 = &d;
        pc = &c;
        
        cout << "p1:" << p1 << endl;
        cout << "p2:" << p2 << endl;
        cout << "pc:"  << (void *)pc << endl;
        cout << "p3:" << p3 << endl;
        
        return 0;
 } 
运行结果:
1:0x70fdfc
p2:0x70fdf8
pc:0x70fdf7
p3:0x70fdf0
十二进制从0到c刚好是12个字节的长度,而我们只定义了3个整型和1个字符型,这就体现了对齐;
(注意,要输出字符型的地址,必须强制转换为void*型,本来想用reinterpret_case的,但之前试过一直报错说有精度损失(在dev_c++上),就没用了)

既然指针变量存放的是一个地址,而32位系统的地址都是4个字节,为什么不用一个整形变量来存储就可以而要发明指针变量呢?
个人认为:
首先,这个问题有局限性,它局限于32位系统,而没有考虑到随着时代的发展计算机会发生进步,如今已经有64位,而64位对应的是8个字节而不是4个字节,而整型变量许多的64位编译器都以4个字节为标准,这样就不能够靠一个整型变量来储存了;
其次,我们要分清楚,整型变量的用途,储存整型数据储存整型数据储存整型数据,它不是发明用来储存地址的,因为你不可能拿着可乐瓶装雪碧去卖吧??


对于指针p,我们用语句p++并不是让其地址+1,而是加一个该地址对应类型的字节长度;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 18:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表