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

 

 

 

 

 

posted @ 2024-09-10 09:12  雨里青山隐  阅读(3)  评论(0编辑  收藏  举报