关于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。
通过这个例子可以看出,不管是传址还是传值都是传的变量的一份拷贝,要想改变变量本身的值,就应该传该变量本身的地址。
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
- 关于c语言传值与传址的理解
- 结构体指针(关于C语言传值的理解)
- 关于C语言动态分配内存传指针的理解
- 关于C语言的理解
- C语言中关于const与指针结合的理解
- 关于C语言的传值问题
- c语言关于strlen函数的理解
- C语言中关于段的理解
- 关于C语言指针的理解
- 关于 语言 编译与解释的理解
- C语言 数组与指针的理解
- C语言 数组与指针的理解
- C语言段与内存的理解
- 汇编语言与C语言的理解
- 关于c语言二维数组与指针的个人理解及处理办法。
- C语言的传值与传址调用
- C语言的传值与传址调用
- C语言传值与传址的区别
- windows下面写的中文注释.在linux下面乱码.
- NOR Flash擦写和原理分析
- extjs学习07——extjs的初级UI设计4(Window实例改进)
- Java装饰模式,生成密码实例
- simple-des算法的java实现
- 关于c语言传值与传址的理解
- android studio 在线更新android sdk,遇到无法Fetching https://dl-ssl.google.com/...的解决方案
- JAVA NIO 简介
- Microsoft Word Documents from ASP.NET
- 骨骼动画_2
- Eclipse中使用Junit编写测试用例
- 2014华为校招 重邮机试 2013.9.15 第三场
- XDOJ1140 - 我们都会
- 最长公共子序列