马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 一叶枫残 于 2021-2-8 18:04 编辑
对于下行代码一定要记一下:被定义为指针的只有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,而是加一个该地址对应类型的字节长度;
|