您的位置:首页 > 编程语言 > C语言/C++

C++:const和sizeof

2016-06-10 16:38 295 查看
x=(y&z) 首先y和z按位与,结果赋值给x.


假设y=z=3;则y的二进制表示为0011,按位与后,结果还是3,所以x=3

2.
x=(y&&z) y和z进行与运算,同时为真,则结果为1,否则结果为0


假设y=z=3,则x=1;

3.const和 *用法

int b=500;
const int *a=&b; //情况1
int const *a=&b; //情况2
int * const a=&b; //情况3
const int * const a=&b;//情况4


情况一

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针所值为常量。

如果const位于星号的右侧,const修饰指针的本身,指针的本身是常量

因此1 和2 的情况相同,不允许对内容修改。

int b=600;
const int *a=&b;
*a=500;//错误,不能通过指针修改指针指向的内容


//不可以通过*a修改值,但是可以通过b修改值
int b=600;
const int *a=&b;
b=500;
cout<<*a<<endl;//得到500


//另外的一种改变*a的办法就是a指向别处
int b=500,c=600;
const int *a=&b;
a=&c;
cout<<*a<<endl;//得到600


a是一名仓库管理员,他进入的仓库,里面的货物都是(*a),他没有权限动。

对于情况一,可以先不进行初始化。因为虽然指针内容是常量,但是指针的本身不是常量。

情况三

指针本身为常量,这种情况下不能对指针本身进行更改操作,而指针所指向的内容不是常量

如果a是一个仓库管理员,他只能进入指定的仓库,而不能去别的仓库(所以a++是错误的)但这个仓库里面的货物(*a)是可以随便动的,(*a=600是对的),此外定义的同时必须初始化

int b=500,c=600;
int *const a; //错误,没有进行初始化
int *const a=&b;
*a=600;//正确,允许改值
cout<<a++<<endl; //常量指针,指针只能指向一个位置,不能改变


情况四

对于情况四,指针本身和指向的内容都是常量,那么仓库管理员只能去特定的仓库,并且仓库的东西也不能改变。

4.const和#define有什么不同

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,对后者只是进行字符替换,没有类型安全检查,并且在字符替换中可能产生想不到的错误

有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

C++中一般用const而不使用宏常量

5.sizeof

struct {
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
char *ss1="0123456789";
char ss2[]="0123456789";
char ss3[100]="0123456789";
int ss4[100];
char q1[]="abc";
char q2[]"a\n";
char *q3="a\n";
char *str1=(cahr *)malloc(100);
void *str2=(void *)malloc(100);


A和B是两个结构体,

当结构体中元素的长度都小于处理器位数的时候,以结构体中最长数据元素的长度为对齐单位,也就是说结构体长度一定是最长数据元素的整数倍。

当结构体中存在的长度大于处理器位数时,那么以处理器的位数为对齐单位。

所以A中有3个short类型的变量,各自以2字节对齐,sizeof(A)为6.

B中a1为4字节对齐,a2为2字节对齐,结构体默认的对齐参数为8,a1取4字节,a2为2字节,结构体的大小为6字节,6不是4的整数倍,补空字节,增到8字节,则sizeof(B)为8

ss1是一个字符指针,指针的大小是一个定值,就是4个字节。所以sizeof(ss1)就是4字节

ss2是一个字符数组,一个字符占一个字节,10个字符就是10个字节,再加上隐含的“\0”,所以一共是11个字节,sizeof(ss2)是11个字节

ss3也是一个字符数组,但是开始预分配100,所以大小是100个字节

ss4也是整型数组,开始预分配100,但是每个整型变量占用的空间是4,所以它的大小一共是400字节。

q1也是数组,加上”\0”也是4个字节

q2里面有一个”\n”,也算作一位,所以是三个字节

q3是一个指针,指针的大小是一个定值,就是4

str1和str2都是指针,都是4字节。

5.sizeof

class A1
{
public:
int a;
static int b;
A1();
~A1();
}
class A2
{
PUBLIC:
int a;
char c;
A2();
~A2();
}


因为静态变量是放在全局数据区的,而sizeof计算栈中分配的大小,所以是不会计算静态变量,所以sizeof(A1)是4

为了照顾对齐,int的大小是4,char的大小是1,所以sizeof(A2)是8

6.sizeof和strlen区别

char *ss="0123456789";
//sizeof(ss)结果为4,ss是指向字符串常量的字符指针
//sizeof(*ss)结果为1,*ss是第一个字符


char ss[]="0123456789";
//sizeof(ss)为11,ss是数组,计算到"\0"的位置,因此是(10+1)
//sizeof(*ss)结果为1,*ss是第一个字符


char ss[100]="0123456789";
//sizeof(ss)结果为100,ss表示在内存中预分配的大小,100*1
//strlen(ss)结果为10,计算字符串的长度,直到"\0"为止


int ss[100]="0123456798";
//sizeof(ss)结果为400,ss表示内存中大小
//strlen错误,它的参数只能是char*,且必须是以"\0"结尾的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 sizeof