如题,需要兼顾时间与空间效率。有如下代码,哪个是指针传递,哪个是引用传递?
main()
{
DB_ENV *myEnv;
DB *dbp;
int ret;
u_int32_t env_flags;
CreateTable(*myEnv,dbp,ret,env_flags,_T("database.db"),_T("table1"));
}void CreateTable(DB_ENV &sEnv,DB *sDbp,int &sRet,u_int32_t &sFlag,CString database_name,CString table_name)
{
sDbp=NULL;
sRet = db_create(&sDbp, &sEnv, 0);
sFlag = DB_CREATE;
sRet = sDbp->open(sDbp, NULL, database_name, table_name, DB_BTREE, sFlag, 0); 
sDbp->close(sDbp,0);
}

解决方案 »

  1.   

    CreateTable函数如果这样改写
    void CreateTable(DB_ENV &sEnv,DB &sDbp,int &sRet,u_int32_t &sFlag,CString database_name,CString table_name)
    如何在内部使用sDbp啊,使用BerkeleyDB的朋友请看一下。
      

  2.   

    没有差别,在底层,传递和指针最终使用的实际参数都是一个地址。
    我估计这两种类型是为了使高级语言更容易编写和纠错。
    在高级语言中,如果你写成void CreateTable(DB_ENV *sEnv……)这样,那么sEnv所指就有可能是空地址或者不正确的地址。如果你写成void CreateTable(DB_ENV &sEnv……),那么除非你在实参中使用了*运算符,否则sEnv就不可能指向一个空地址或错误地址。
      

  3.   

    写成DB &sDpb时,在实现函数中用sDpb(*sDpb,……)这样的方式时会报编译错误。
      

  4.   

    这可能是BerkeleyDB的语法约定,请有BerkeleyDB使用经验的朋友支支招,谢了。
      

  5.   

    void CreateTable(DB_ENV &sEnv,DB *sDbp,int &sRet,u_int32_t &sFlag,CString database_name,CString table_name)
    {
    sDbp=NULL;
    sRet = db_create(&sDbp, &sEnv, 0);
    sFlag = DB_CREATE;
    sRet = sDbp->open(sDbp, NULL, database_name, table_name, DB_BTREE, sFlag, 0);  
    sDbp->close(sDbp,0);
    }
    sRet = db_create(&sDbp, &sEnv, 0);//这行代码有毛病吧!!!代码有什么用意呢?&sDbp只是个临时地址
      

  6.   

    用什么传递效率高主要看你在传递的时候是否在你不知情的时候构造了不需要的对象,你用指针或者引用都不会构造新的对象。传指针和传引用就是表达形式上的不同,如果作为输入,可以加上const修饰,如果作为输出就不加。
    在输出时传指针有个特点,就是一看到你的函数调用,能猜测出大概是作为输出的,因为前面有个&。
      

  7.   

    16:       int xx;
    17:
    18:       a( &xx );
    004010A8   lea         eax,[ebp-4]
    004010AB   push        eax
    004010AC   call        @ILT+5(a) (0040100a)
    004010B1   add         esp,4
    19:       b( xx );
    004010B4   lea         ecx,[ebp-4]
    004010B7   push        ecx
    004010B8   call        @ILT+0(b) (00401005)
    004010BD   add         esp,4汇编中还真是没什么差别。