第43节:数组(第一节)
1、什么时候要用到数组
比如:定义一个变量,用来存储一个年龄。
或者定义十个变量,用来存储十个人的年龄
注意:定义数组的时候数组的值必须是常量。否则编译器会报错。
定义数组例子:
int age[10];
00401011 mov ebp,esp
00401013 sub esp,68h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-68h]
0040101C mov ecx,1Ah
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
这个反汇编的代码中有一行是提升堆栈的值 lea edi,[ebp-68h] ,就是这行,告诉我们需要使用多大空间的内存。所以在C语言里面数组定义的长度一定是常量。
2、数组的初始化:
例子:
int age[10]={1,2,3,4,5,6,7,8,9};
反汇编代码:
0040D408 mov dword ptr [ebp-28h],1
0040D40F mov dword ptr [ebp-24h],2
0040D416 mov dword ptr [ebp-20h],3
0040D41D mov dword ptr [ebp-1Ch],4
0040D424 mov dword ptr [ebp-18h],5
0040D42B mov dword ptr [ebp-14h],6
0040D432 mov dword ptr [ebp-10h],7
0040D439 mov dword ptr [ebp-0Ch],8
0040D440 mov dword ptr [ebp-8],9
0040D447 xor eax,eax
0040D449 mov dword ptr [ebp-4],eax
注意:数组的地址编号成员,每个地址都会差4,地址编号是从小到大的排列往下走。
如果你写成:int age[ ]={1,2,3,4,5,6,7,8,9}; 这样编译器也能识别你的数组的长度有多少,可以看如下汇编就明白了:
4: int age[]={1,2,3,4,5,6,7,8,9};
0040D408 mov dword ptr [ebp-24h],1
0040D40F mov dword ptr [ebp-20h],2
0040D416 mov dword ptr [ebp-1Ch],3
0040D41D mov dword ptr [ebp-18h],4
0040D424 mov dword ptr [ebp-14h],5
0040D42B mov dword ptr [ebp-10h],6
0040D432 mov dword ptr [ebp-0Ch],7
0040D439 mov dword ptr [ebp-8],8
0040D440 mov dword ptr [ebp-4],9
以上就是数组初始化的两种方式。
1、什么时候要用到数组
比如:定义一个变量,用来存储一个年龄。
或者定义十个变量,用来存储十个人的年龄
注意:定义数组的时候数组的值必须是常量。否则编译器会报错。
定义数组例子:
int age[10];
汇编代码:
00401010 push ebp00401011 mov ebp,esp
00401013 sub esp,68h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-68h]
0040101C mov ecx,1Ah
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
这个反汇编的代码中有一行是提升堆栈的值 lea edi,[ebp-68h] ,就是这行,告诉我们需要使用多大空间的内存。所以在C语言里面数组定义的长度一定是常量。
2、数组的初始化:
例子:
int age[10]={1,2,3,4,5,6,7,8,9};
反汇编代码:
0040D408 mov dword ptr [ebp-28h],1
0040D40F mov dword ptr [ebp-24h],2
0040D416 mov dword ptr [ebp-20h],3
0040D41D mov dword ptr [ebp-1Ch],4
0040D424 mov dword ptr [ebp-18h],5
0040D42B mov dword ptr [ebp-14h],6
0040D432 mov dword ptr [ebp-10h],7
0040D439 mov dword ptr [ebp-0Ch],8
0040D440 mov dword ptr [ebp-8],9
0040D447 xor eax,eax
0040D449 mov dword ptr [ebp-4],eax
注意:数组的地址编号成员,每个地址都会差4,地址编号是从小到大的排列往下走。
如果你写成:int age[ ]={1,2,3,4,5,6,7,8,9}; 这样编译器也能识别你的数组的长度有多少,可以看如下汇编就明白了:
4: int age[]={1,2,3,4,5,6,7,8,9};
0040D408 mov dword ptr [ebp-24h],1
0040D40F mov dword ptr [ebp-20h],2
0040D416 mov dword ptr [ebp-1Ch],3
0040D41D mov dword ptr [ebp-18h],4
0040D424 mov dword ptr [ebp-14h],5
0040D42B mov dword ptr [ebp-10h],6
0040D432 mov dword ptr [ebp-0Ch],7
0040D439 mov dword ptr [ebp-8],8
0040D440 mov dword ptr [ebp-4],9
以上就是数组初始化的两种方式。