3月22日 几个bother me的小问题

太倒霉了,刚打好的就不知怎地被关了,,

首先是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值