初学者可能对指针了解的不是很深入,下面我集中的介绍下指针的使用,它与所指的对象是一个什么样的关系。
有如下C代码:
int
i=-5;
int
*te = &i;
cout<<&i<<
" "
<<te<<
" "
<<&te<<endl;
输出为:0013FF2C 0013FF2C 0013FF20
我们看都te跟&i是一样的地址,其实都是指向i,而&te就是te所在的那个地址,因为指针也需要控件来存储。
我们看汇编代码:
int i=-5;
0041435F mov dword ptr [ebp-3Ch],0FFFFFFFBh
//这里把-5放到ebp-3ch这个地址因为int是4个字节所以是双字,
//dword ptr[地址],把值放入这个地址。
int *te = &i;
00414366 lea eax,[ebp-3Ch]
// 这里是把ecp-3ch这个地址值给eax,也就i的地址值
00414369 mov dword ptr [ebp-48h],eax eax (
//i的地址值)给了ebp-48h这个地址(即&te)
// 我们看到ebp-48h - (ebp - 3ch) = 12 = ch ,同样我们上面的输出也是相差ch。
//所以说te的地址是0013FF20 ,但是它指向的控件是0013FF2C。
下面的输出不再分析.
cout<<&i<<" "<<te<<" "<<&te<<endl;
0041436C mov esi,esp
0041436E mov eax,dword ptr [__imp_std::endl (41A31Ch)]
00414373 push eax
00414374 mov edi,esp
00414376 lea ecx,[ebp-48h]
00414379 push ecx
0041437A push offset string " " (4179ACh)
0041437F mov ebx,esp
00414381 mov edx,dword ptr [ebp-48h]
00414384 push edx
00414385 push offset string " " (41796Ch)
0041438A mov eax,esp
0041438C lea ecx,[ebp-3Ch]
0041438F push ecx
00414390 mov ecx,dword ptr [__imp_std::cout (41A320h)]
00414396 mov dword ptr [ebp-160h],eax
0041439C call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A330h)]
004143A2 mov ecx,dword ptr [ebp-160h]
004143A8 cmp ecx,esp
004143AA call @ILT+410(__RTC_CheckEsp) (41119Fh)
004143AF push eax
004143B0 call std::operator<<<std::char_traits<char> > (41128Ah)
004143B5 add esp,8
004143B8 mov ecx,eax
004143BA call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A330h)]
004143C0 cmp ebx,esp
004143C2 call @ILT+410(__RTC_CheckEsp) (41119Fh)
004143C7 push eax
004143C8 call std::operator<<<std::char_traits<char> > (41128Ah)
004143CD add esp,8
004143D0 mov ecx,eax
004143D2 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A330h)]
004143D8 cmp edi,esp
004143DA call @ILT+410(__RTC_CheckEsp) (41119Fh)
004143DF mov ecx,eax
004143E1 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A308h)]
004143E7 cmp esi,esp
004143E9 call @ILT+410(__RTC_CheckEsp) (41119Fh)