返回值要与返回类型匹配


返回之后赋值给i 也就是我们的申请的char变量
如果是short返回的话 用ax返回

猜测一下ax赋值给ebp-2

参数传递的本质
8位参数传递
在内存中还是以4字节存放 不存在传入一个字节内存大小的参数
参数传递的本质:将上层函数的变量,或者表达式的值“复制一份”,传递给下层函数.
本机尺寸
虽然内存是四字节 但是在实际使用中还是按照1字节使用
局部变量
小于32位的局部变量 在分配内存时候 还是按照32位的局部变量分配内存

使用时候按照实际的宽度使用
参数和局部变量没有区别
都是局部变量 都存放在栈中 完全可以把参数当作局部变量使用
#include<stdio.h>
short function()
{
return 0;
}
void Function(int x,int y,int z)
{
z = 10;
}
int main()
{
Function(1,2,3);
return 0;
}
这里的z也可以当作局部变量使用因为也在堆栈中
参数是在函数调用初始的值
数组的本质

一堆等宽的变量 起了一个名字 叫数组
声明数组的长度必须是确定的
int arr[10] = {0};
编译器会利用循环 给数组赋值
赋值语句的本质

桶排序
1.创建int数组 看哪个数最大 创建int[max+1]={0};
2 4 6 5 3 1 2 7
0 0 0 0 0 0 0 0
第一个数是2 在下表为2的地方改为1
0 0 1 0 0 0 0 0
以此类推可得到
0 1 2 1 1 1 1 1
0 1 2 3 4 5 6 7
表的映射
下标为0 并不是1 说明要排序的数中没有0 有1代表存在这个数以此类推
0 1 2 2 3 4 5 6 7
缺点
最大的值最大的时候 并不是一个好的办法 间隔小 比较均匀
数组和循环一般在一起
练习01
1、返回值超过32位时,存在哪里?用long long(__int64)类型做实验
long long类型在VC6中对应的是__int64
__int64 Function()
{
__int64 x = 0x1234567890;
return x;
}

可以看到局部变量是分开存放两个32位的内存地址中 返回的时候也是放在俩个32位的寄存器返回的 edx存放高位 eax地位
练习02

2、char arr[3] = {1,2,3};与 char arr[4] = {1,2,3,4};
哪个更节省空间,从反汇编的角度来说明你的观点
可以看到我们申请了3个char 分配了四个字节 申请了四个char 也是四个字节 不是局部变量的char和short都是作为int申请内存分配 如果我们数组是10个char元素呢 分配的空间应该是 0x4C 验证一下

可以看到就是4C 同时下面赋值也不是循环赋值 因为我们每个数组元素都不一样 所以是单个赋值 开辟的是4c 但是使用的时候还是作为char类型占一个字节使用

练习03
3、找出下面赋值过程的反汇编代码
void Function()
{
int x = 1;
int y = 2;
int r;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
r = arr[1];
r = arr[x];
r = arr[x+y];
r = arr[x*2+y];
}
反汇编代码
23: int x = 1;
00401128 mov dword ptr [ebp-4],1
24: int y = 2;
0040112F mov dword ptr [ebp-8],2
25: int r;
26: int arr[10] = {1,2,3,4,5,6,7,8,9,10};
00401136 mov dword ptr [ebp-34h],1
0040113D mov dword ptr [ebp-30h],2
00401144 mov dword ptr [ebp-2Ch],3
0040114B mov dword ptr [ebp-28h],4
00401152 mov dword ptr [ebp-24h],5
00401159 mov dword ptr [ebp-20h],6
00401160 mov dword ptr [ebp-1Ch],7
00401167 mov dword ptr [ebp-18h],8
0040116E mov dword ptr [ebp-14h],9
00401175 mov dword ptr [ebp-10h],0Ah
27:
28: r = arr[1];
0040117C mov eax,dword ptr [ebp-30h]
0040117F mov dword ptr [ebp-0Ch],eax
29: r = arr[x];
00401182 mov eax,dword ptr [ebp-4]
00401185 mov ecx,dword ptr [ebp+eax*4-34h]
00401189 mov dword ptr [ebp-0Ch],ecx
30: r = arr[x+y];
0040118C mov eax,dword ptr [ebp-4]
0040118F add eax,dword ptr [ebp-8]
00401192 mov ecx,dword ptr [ebp+eax*4-34h]
00401196 mov dword ptr [ebp-0Ch],ecx
31: r = arr[x*2+y];
00401199 mov eax,dword ptr [ebp-4]
0040119C mov ecx,dword ptr [ebp-8]
0040119F lea edx,[ecx+eax*2]
004011A2 mov eax,dword ptr [ebp+edx*4-34h]
004011A6 mov dword ptr [ebp-0Ch],eax
32: }
04练习
桶排序代码实现
自己写的屎山代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
//[29, 25, 3, 49, 9, 37, 21, 43]
int arr[50]={0};
int exampl[8]={29, 25, 3, 49, 9, 37, 21, 43};
int i ;
int j ;
int k ;
for (j=0;j<8;j++)
{
for (i=0; i<50; i++)
{
if (exampl[j]-1 == i)
{
arr[i] =1;
continue;
}
}
}
for (k = 0;k<50;k++)
{
if (arr[k] == 1)
{
printf("%d ",k+1);
}
}
system("pause");
}
经过豆包指点修改为以下代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[50]={0};
int exampl[8]={29, 25, 3, 49, 9, 37, 21, 43};
int i ;
int j ;
int k ;
for (j=0;j<8;j++)
{
i = exampl[j] - 1;
arr[i] = 1;
}
for (k = 0;k<50;k++)
{
if (arr[k] == 1)
{
printf("%d ",k+1);
}
}
system("pause");
return 0;
}