- #include<cstdio>
- #include<iostream>
- #include<string>
- #include<cstdlib>
- using namespace std;
- struct{
- short a1;
- short a2;
- short a3;
- }A;
- struct{
- long a1;
- short a2;
- }B;
- int main()
- {
- char *s1="0123456789";
- char s2[]="0123456789";
- char s3[100]="0123456789";
- int s4[100];
- char q1[]="abc";
- char q2[]="a\n";
- char *q3="a\n";
- char *str1=(char *)malloc(100);
- cout<<sizeof(s1)<<" ";
- cout<<sizeof(s2)<<" ";
- cout<<sizeof(s3)<<" ";
- cout<<sizeof(q1)<<" ";
- cout<<sizeof(q2)<<" ";
- cout<<sizeof(q3)<<" ";
- cout<<sizeof(A)<<" ";
- cout<<sizeof(B)<<" ";
- cout<<sizeof(str1)<<" ";
- //cout<<sizeof(str2)<<" ";
- cout<<sizeof(*str1)<<" ";
-
- return 0;
- }}
- 输出结果:4 11 100 4 3 4 6 8 4 1
A和B是两个结构体,在默认情况下方便对解雇内元素的访问和刮泥,当结构体内的元素的长度都小于处理器的位数的时候,变以结构体内最长的数据元素为堆积单元。
结构体A有三个short类型变量,各自以2字节对齐,结构体对齐按默认8字节对齐,则a1/a2/a3都取2字节对齐sizeof(A)为6,也是2的整数倍。B中a1为4字节对齐,a2为2字节对齐,结构体默认对齐参数为8,a1取4字节对齐,a2取2字节对齐,结构体大小为6字节,6不足4的整数倍不空字节增到8时符合条件sizeof(B)为8字节。
s1是一个字符指针,指针的大小是一个定值就是4字节。str1相似。
q2里面有一个'\n'算作一个位。
*str1大小为1字节。
指针和引用的差异:
非空区别:在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象。
合法性区别:在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试防止为空。
可修改区别:指针可以被重新赋值以指向另一个不同的对象,但是引用则总是指向初始化时被指定的对象,以后不能改变,但指定的对象其内容可以改变。
应用区别:考虑到存在不指向任何对象的可能,能够设置指针为空,二是需要能够在不同的时刻指向不同的对象,如果总是指向一个对象并且一旦指向一个对象后就不会改变指向那么应该使用引用。
阅读(1019) | 评论(0) | 转发(1) |