65,211
社区成员
发帖
与我相关
我的任务
分享#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned long ulong;
int main()
{
ulong ulArray[10] = {0};
void* addr1 = &ulArray; /* 1 */
void* addr2 = &(ulArray[0]); /* 2 */
void* addr3 = ulArray; /* 3 */
printf("%d,%d,%d",(ulong)addr1,(ulong)addr2,(ulong)addr3);
return 0;
}
#include <typeinfo>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned long ulong;
int main()
{
ulong ulArray[10] = {0};
void* addr1 = &ulArray; /* 1 */
void* addr2 = &(ulArray[0]); /* 2 */
void* addr3 = ulArray; /* 3 */
printf("%d,%d,%d",(ulong)addr1,(ulong)addr2,(ulong)addr3);
printf("\n");
printf("%s,%s,%s",typeid(&ulArray).name(),typeid(&ulArray[0]).name(),typeid(ulArray).name());
system("pause");
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned long ulong;
int main()
{
ulong ulArray[10] = {0};
void* addr1 = &ulArray; /* 1 */
void* addr2 = &(ulArray[0]); /* 2 */
void* addr3 = ulArray; /* 3 */
printf("%d,%d,%d",(ulong)addr1,(ulong)addr2,(ulong)addr3);
return 0;
}
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char *envp)
.text:00401000 _main proc near ; CODE XREF: ___tmainCRTStartup+15Ap
.text:00401000
.text:00401000 var_34 = dword ptr -34h
.text:00401000 var_30 = dword ptr -30h
.text:00401000 var_2C = dword ptr -2Ch
.text:00401000 var_28 = dword ptr -28h
.text:00401000 var_24 = dword ptr -24h
.text:00401000 var_20 = dword ptr -20h
.text:00401000 var_1C = dword ptr -1Ch
.text:00401000 var_18 = dword ptr -18h
.text:00401000 var_14 = dword ptr -14h
.text:00401000 var_10 = dword ptr -10h
.text:00401000 var_C = dword ptr -0Ch
.text:00401000 var_8 = dword ptr -8
.text:00401000 var_4 = dword ptr -4
.text:00401000 argc = dword ptr 8
.text:00401000 argv = dword ptr 0Ch
.text:00401000 envp = dword ptr 10h
.text:00401000
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 sub esp, 34h
.text:00401006 mov [ebp+var_28], 0 ; 数组初始化,ulArray[0]=0
.text:0040100D xor eax, eax
.text:0040100F mov [ebp+var_24], eax ; 数组初始化,ulArray[1]=0
.text:00401012 mov [ebp+var_20], eax ; 数组初始化,ulArray[2]=0
.text:00401015 mov [ebp+var_1C], eax ; 数组初始化,ulArray[3]=0
.text:00401018 mov [ebp+var_18], eax ; 数组初始化,ulArray[4]=0
.text:0040101B mov [ebp+var_14], eax ; 数组初始化,ulArray[5]=0
.text:0040101E mov [ebp+var_10], eax ; 数组初始化,ulArray[6]=0
.text:00401021 mov [ebp+var_C], eax ; 数组初始化,ulArray[7]=0
.text:00401024 mov [ebp+var_8], eax ; 数组初始化,ulArray[8]=0
.text:00401027 mov [ebp+var_4], eax ; 数组初始化,ulArray[9]=0
.text:0040102A lea ecx, [ebp+var_28] ; ebp+var_28=数组ulArray的第0个元素地址
.text:0040102D mov [ebp+var_34], ecx ; [ebp+var_34]=&ulArray[0],即代码中的addr1 = &ulArray;
.text:00401030 lea edx, [ebp+var_28]
.text:00401033 mov [ebp+var_2C], edx ; 同理:代码中的addr2 = &(ulArray[0])
.text:00401036 lea eax, [ebp+var_28]
.text:00401039 mov [ebp+var_30], eax ; void* addr3 = ulArray;
.text:0040103C mov ecx, [ebp+var_30]
.text:0040103F push ecx ; 压入addr3
.text:00401040 mov edx, [ebp+var_2C]
.text:00401043 push edx ; 压入addr2
.text:00401044 mov eax, [ebp+var_34]
.text:00401047 push eax ; 压入addr1
.text:00401048 push offset aDDD ; "%d,%d,%d"
.text:0040104D call sub_40105B ; printf函数输出
.text:00401052 add esp, 10h
.text:00401055 xor eax, eax
.text:00401057 mov esp, ebp
.text:00401059 pop ebp
.text:0040105A retn
.text:0040105A _main endp
ulong ulArray[10] = {0};
void* addr1 = &ulArray; /* 1 */
void* addr2 = &(ulArray[0]); /* 2 */
void* addr3 = ulArray; /* 3 */
void* addr1 = &ulArray; /* 1 */
void* addr2 = &(ulArray[0]); /* 2 */
其实1,2相等也很好理解啊,这样证明吧:
ulong *p1 == ulArray;
ulong *p2 == ulArrat[0] == p1 + 0;
所以p1 == p2
所以&p1 == &p2,但是这样证明很没意思啊,纯数学了,希望得到从内存角度得到解释,呵呵