关于c语言传值与传址的理解

来源:互联网 发布:图片大小编辑软件 编辑:程序博客网 时间:2024/06/07 06:47
传值:
void swap(int x,int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main(void)
{
int a = 3;
int b = 4;
swap(a,b);
}
在主函数中调用swap()无法改变a,b的值,因为传给swap()的参数实际上是a,b变量的一份拷贝_a,_b,他们和a,b的地址并不一样,当调用完swap后,它所占的内存空间会被释放,所以a,b的值并没有被改变。


传址:


void swap(int* x,int* y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
int main(void)
{
int a = 3;
int b = 4;
swap(&a,&b);
}


通过调用swap()可以改变a,b的值,因为此时传递的是a,b的地址,在swap()中改变*x,*y的值就相当于在改变a,b的值,因为他们的地址是一样的,即使调用完swap后,它所占的内存空间会被释放,但a,b的值已被改变。


void getMemory(char* p,int num)
  {
p = (char*)malloc(num);
}


int main(void)
{
char* str = NULL;
getMemory(str,10);
strcpy(str,"hello");
printf("%s\n",str);


return 0;
}


这个例子是刚刚做的一道面试题,运行会报段错误,它和传址调用有点区别:getMemory()函数是想改变指针变量str本身的值,而不是改变*str的值,虽然在getMemory()函数中p的值会被改变,但当它调用完后,p会被释放,所以str的值还是为空,要想改变str的值,应该传&str。


通过这个例子可以看出,不管是传址还是传值都是传的变量的一份拷贝,要想改变变量本身的值,就应该传该变量本身的地址。


0 0
原创粉丝点击