太倒霉了,刚打好的就不知怎地被关了,,
首先是typedef ,总是见到,但自己还真就没咋用过
如果不用typedef
#include <stdio.h>
struct _shit
{
int A,b;
}shi,*pshi;
void main(void)
{
struct _shit p;
struct _shit* p2;
p2 = &p;
p2->A = 5;
printf("%d/n",p2->A );
shi.A = 1;
pshi = &shi;
pshi->b = 2;
printf("shi's A:%d b:%d/n",pshi->A ,shi.b );
}
shi 和pshi只是一个普通的struct _shit的变量和指针,和mAin()中的p和p2没有区别,定义struct _shit 的变量和指针的时候也必须用struct _shit p; sturct _shit* p2;
如果用了typedef的话
#include <stdio.h>
typedef struct _shit
{
int A,b;
}shi,*pshi;
void main(void)
{
shi p;
pshi p2;
p2 = &p;
p2->A = 5;
printf("%d/n",p2->A );
}
shi 和pshi就变成了struct _shit的类型和其指针类型,因此在定义struct _shit的变量和指针的时候就可以用shi p;和pshi p2;
另外只要是指针,无论指向什么,都是4字节;
//--------------------------------------------------------------------------------------------
另外就是c++中的&了,说是地址引用,实际上是比c更墨迹了,,以前用c++的时候都不喜欢用这个,
#include <iostream>
class shit
{
public:
int A,b;
public:
int shi(void);
};
int func(shit* s);
int main(void){
shit shi,*dAbiAn;
dAbiAn = &shi;
func(dAbiAn);
shi.shi ();
printf("%d %d/n",shi.A,shi.b );
printf("size %d /n",sizeof(dAbiAn));
return 0;
}
//--------------------------------------------------------------------
int func(shit* s)
{
s->A = 5;
return 0;
}
//--------------------------------------------------------------------
int shit::shi (void)
{
this->b = 3;
return 0;
}
//--------------------------------------------------------------------
在这个小程序里很说明问题
如果是int func(shit* s) 那很显然和 c里一样要传进去个指针类型的,或者把变量取地址func(&shi)这样引用,
如果是 int func(shit* &s),传指针类型的同样没问题,就当&不存在好了,,他们的汇编出来都是完全一样的.但由于这两种形式都是将虚函数s定义成了指针,所以在func函数中要把s当作指针来用,既用->,,
如果是 int func(shit &s),则要传进来变量或对象func(shi),在函数func里把形参s当作变量用,s.b 如传指针也要这样func(*dAbiAn),
要记住的就是c++的类型强制转换是很困难的,它的形参是什么就给它传什么就可以了,但在汇编程序来看无论是形参是声名成指针shit* s 还是shit* &s 还是 shit &s ,都是一样的,取的s在栈中偏移地址
13: shit shi,*dAbiAn;
14: dAbiAn = &shi;
00401169 8D 45 F8 lea eax,[ebp-8]
0040116C 89 45 F4 mov dword ptr [ebp-0Ch],eax
15: func(shi);
0040116F 8D 4D F8 lea ecx,[ebp-8]
00401172 51 push ecx
00401173 E8 8D FE FF FF call @ILT+0(func) (00401005)
00401178 83 C4 04 add esp,4