64,687
社区成员
发帖
与我相关
我的任务
分享
void test1(A[]) {
0113DAD0 push ebp
0113DAD1 mov ebp,esp
0113DAD3 sub esp,0C0h
0113DAD9 push ebx
0113DADA push esi
0113DADB push edi
0113DADC lea edi,[ebp-0C0h]
0113DAE2 mov ecx,30h
0113DAE7 mov eax,0CCCCCCCCh
0113DAEC rep stos dword ptr es:[edi]
}
void test2(A *) {
0113DE80 push ebp
0113DE81 mov ebp,esp
0113DE83 sub esp,0C0h
0113DE89 push ebx
0113DE8A push esi
0113DE8B push edi
0113DE8C lea edi,[ebp-0C0h]
0113DE92 mov ecx,30h
0113DE97 mov eax,0CCCCCCCCh
0113DE9C rep stos dword ptr es:[edi]
}
可以看到,编译器全部都当作指针来使用的。OK,结束
void test1(char []) {
}
void test2(char *) {
}
同时测试了复杂类型:
class A {
public:
A() { };
~A() {};
};
void test1(A[]) {
}
void test2(A *) {
}
发现汇编代码如下:
char b[5];
char* a=NULL;
test1(b);
test2(b);
test1(a);
test2(a);
发现编译器会自动将这段代码生成如下汇编代码:
test1(b);
00BD03F4 lea eax,[b]
00BD03F7 push eax
00BD03F8 call test1 (0BA72A3h)
00BD03FD add esp,4
test2(b);
00BD0400 lea eax,[b]
00BD0403 push eax
00BD0404 call test2 (0BA8658h)
00BD0409 add esp,4
test1(a);
00BD040C mov eax,dword ptr [a]
00BD040F push eax
00BD0410 call test1 (0BA72A3h)
00BD0415 add esp,4
test2(a);
00BD0418 mov eax,dword ptr [a]
00BD041B push eax
00BD041C call test2 (0BA8658h)
00BD0421 add esp,4
可以看到,现代C++已经完全摒弃了数组的用法(至少在简单类型方面),而直接用指针加偏移量去取代数组,
其实你并不需要为此担心,这个并不会对程序正确性有所影响。
刚学C++的时候纠结于语法是很正常的,学到后面你就会为当时问出这种问题而感到奇怪。
多实践吧。
char *myreverse(char c[]) {
char temp;
int len = strlen(c);
int i = 0, j = len - 1;
while (i<j)
{
temp = c[i];
c[i] = c[j];
c[j] = temp;
i++;
j--;
}
return c;
}
char *myreverse(char *c) {
char temp;
int len = strlen(c);
int i = 0, j = len - 1;
while (i<j)
{
temp = c[i];
c[i] = c[j];
c[j] = temp;
i++;
j--;
}
return c;
}
这两个都可以用,不知道这俩有什么本质区别么