首页 > 代码库 > c++ primer 函数传值1

c++ primer 函数传值1

不看c++ primer  永远不知道自己基础有多差


函数的参数传值一般有两种方式:值传递,引用传递。


值传递有下面两种形式:

void func( int a )
{
//
}

void func1( int *a )
{
//
}

对于 func 和func1都是通过拷贝内存来实现的

func1

int m = 10 ;
func1( int *a ) ;
//处理过程为: a = &m ;  
//然后通过指针 *a 对 m进行间接操作

传引用

void func2( int &a )
{
//
}
引用就是变量的一个别名,不会发生内存的拷贝



典型的面试题:

void GetMemory1(char *p)
{
    p = (char *)malloc(100);
}

void Test1(void) 
{
    char *str = NULL;
    GetMemory1(str); 
    strcpy(str, "hello world");
    printf(str);
}
<p>
</p><pre name="code" class="cpp">// p = str;
// p = malloc(...);
//p和str有半毛线关系?

char *GetMemory2(void){ char p[] = "hello world"; return p;}void Test2(void){ char *str = NULL; str = GetMemory2(); printf(str);}char *GetMemory3(void){ return "hello world";}void Test3(void){ char *str = NULL; str = GetMemory3(); printf(str);}//Test3 中打印hello world,因为返回常量区,而且并没有被修改过。Test2中不一定能打印出hello world,因为指向的是栈。void GetMemory4(char **p, int num){ *p = (char *)malloc(num);}void Test4(void){ char *str = NULL; GetMemory3(&str, 100); strcpy(str, "hello"); printf(str); }//内存没释放void Test5(void){ char *str = (char *) malloc(100); strcpy(str, "hello"); free(str); if(str != NULL) { strcpy(str, "world"); printf(str); }}//str为野指针,打印的结果不得而知void Test6(){ char *str=(char *)malloc(100); strcpy(str, "hello"); str+=6; free(str); if(str!=NULL) { strcpy(str, "world"); printf(str); }}//VC断言失败,运行错误