c语言·其四
sizeof
sizeof是关键字,作用:某个类型有几个字节
printf("%d\n",sizeof(char)); 1
printf("%d\n",sizeof(short int)); 2
printf("%d\n",sizeof(int)); 4
printf("%d\n",sizeof(long int)); 4
printf("%d\n",sizeof(__int64)); 8
printf("%d\n",sizeof(float)); 4
printf("%d\n",sizeof(double)); 8
———————————————————————————————————————
char arr1[10] = {0};
short arr2[10] = {0};
int arr3[10] = {0};
printf("%d\n",sizeof(arr1)); 10
printf("%d\n",sizeof(arr2)); 20
printf("%d\n",sizeof(arr3)); 40
—————————————————————————————————————————
char arr1[10] = {0};
short arr2[10] = {0};
int arr3[10] = {0};
printf("%d\n",sizeof(arr1[10]));1 下标为10的一个元素
printf("%d\n",sizeof(arr2[10])); 2
printf("%d\n",sizeof(arr3[10])); 4
数据对齐
本质:效率还是空间,二选一的结果.
#pragma pack的基本用法为:
#pragma pack( n )
结构体。。。
#pragma pack( )
对齐参数:n为字节对齐数,其取值为1、2、4、8,默认是8。
1.如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准,
即是说,结构体成员的偏移量应该取二者的最小值.
2.若总字节数不是n的倍数,则要补成二的倍数
#pragma pack(1)
struct Test
{
int a ;
__int64 b ;
char c ; 此时以1为准
};
#pragma pack()
当一字节分配时,_int64在空间中是以上图分配
对齐原则:(是系统默认对齐参数的对齐原则)
原则一:数据成员对齐规则:结构的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始
(比如int在32位机为4字节,则要从4的整数倍地址开始存储).
原则二:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
原则三:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。
(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储.)
原则四:对齐参数如果比结构体成员的sizeof值小,该成员的偏移量应该以此值为准.
也就是说,结构体成员的偏移量应该取二者的最小值.
struct S1
{
char a;
int b;
char c;
};
a 0 0 0
b b b b
c 0 0 0
struct S2
{
int a;
char b;
char c;
};
a a a a
b c 0 0 四的整数倍
int a
__int64 b
char c
a a a a 0 0 0 0
b b b b b b b b
c 0 0 0 0 0 0 0八的整数倍
建议:
按照数据类型由小到大的顺序进行书写 (节省空间)
typedef
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。
这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
eg:
1、对已有类型定义别名
typedef unsigned char BYTE;
2.数组类型的定义格式
typedef int vector[10]; 定义一个int型数组叫vector
int main(int argc, char* argv[])
{
vector v; vector赋名为v
v[0] = 1;
v[1] = 2;
v[2] = 3;
v[3] = 4;
v[4] = 5;
return 0;
}
3.结构体的定义格式
typedef struct student
{
int x;
int y;
}stu; student改名为stu
strcpy
strcpy自动补零
strcpy(s.arr,"china");
switch
1、switch语句 是if语句的简写
switch(表达式) switch后面表达式必须为整型
{
case 常量表达式1: case后面必须是常量表达式
语句;
break;
case 常量表达式2: case后常量表达式的值不能一样
语句;
break;
default: 以上条件不成立,则输出
语句;
break;
}
———————————————————————————————————————
mov eax,duord ptr [ebp+8]参数,eax=2
mov duord ptr [ebp-4],eax局部变量,ebp-4等于2
cmp dword ptr [ebp-4],1与1做比较
je Function+32h (0840d7e2)je:等于1就跳转
。。。。。。。。。。。。。。。。
jmp Function+50h(0040d80f)当不等于1,2,3时,跳转
004D7E2 push offset string "1"(00422fa4)
call printf (0840dóa9)
add esp,4
0040D80F push offset string "5" (00422F9C)
call printf (004d6a0)
add esp,4
——————————————————————————————
31;28