C语言函数指针参数也是传值调用
来源:互联网 发布:成都泰迪熊博物馆淘宝 编辑:程序博客网 时间:2024/05/21 07:13
#include <stdio.h>
#include <stdlib.h>
void F(int *pi)
{
pi = (int *)malloc(sizeof(int));
}
main()
{
int *pi = NULL;
F(pi);
printf("%d/n", pi == NULL);
}
如果你指望函数F能帮你改变pi的值,那你就错了,运行上面这段代码,你会发现输出是1。刚开始我也很诧异,我不是传了指针进去吗,为什么没能保留改变的结果呢?
别着急,再看看下面一段代码:
#include <stdio.h>
#include <stdlib.h>
void F(int *pi)
{
*pi = 5;
}
main()
{
int i = 0;
F(&i);
printf("%d/n", i);
}
这次运行代码,i的值被函数F改变了。对比一下两段代码,你会发现:第二段代码中传给函数F的实参是一个整型变量地址的拷贝,函数F拿到了这个地址,改变的是这个地址指向的变量。这样当然可以成功,地址和其拷贝的值是一样的,所以按照这两个地址找到的变量自然也是一样的。第一段代码则完全不同,虽然传给函数F的实参也是一个整型变量地址的拷贝,但函数F试图通过改变这个拷贝来改变原来的地址值,这当然行不通,因为指针和它的拷贝是两个变量。指针也是变量,它在函数调用过程中也是传值调用的。其实第一段代码和下面这段代码效果是类似的:
#include <stdio.h>
#include <stdlib.h>
void F(int i)
{
i = 5;
}
main()
{
int i = 0;
F(i);
printf("%d/n", i);
}
这段代码大家一看就知道函数F不会改变i的值,因为主函数传给F的只是变量i的一份拷贝,改变拷贝的值并不会影响原变量的值。其实这段代码和第一段有什么区别呢,不过一个是整型变量,一个是指针变量,它们都是传值调用的。
那么如何修改第一段代码好让它符合我们的要求呢?其实只需让函数F简单地返回地址:
#include <stdio.h>
#include <stdlib.h>
int *F()
{
return (int *)malloc(sizeof(int));
}
main()
{
int *pi = NULL;
pi = F();
printf("%d/n", pi == NULL);
}
- C语言函数指针参数也是传值调用
- C语言函数指针参数也是传值调用
- C语言函数指针参数也是传值调用
- 指针变量也是传值调用的(C语言)!
- 指针变量也是传值调用的(C语言)
- C语言调用函数指针
- 给初学者提个醒:C/C++函数里的指针参数也是按值传递的!
- C语言函数指针调用函数
- C语言函数调用时参数压栈的顺序以及函数指针的作用
- c语言 指针作为函数参数
- 11.22C语言----指针变量/函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- C语言:指针做函数参数
- c++之const
- GCDAsyncSocket类库,IOS下TCP通讯使用心得
- linux2.6.31版本以后usb/devices输出信息使用usb-devices查看
- HibernateSessionFactoryUtil
- 《黑马程序员》 使用反射替换类中的变量的值
- C语言函数指针参数也是传值调用
- 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码
- 深度分析如何在Hadoop中控制Map的数量
- ARP逆过程——RARP协议流程
- 纯javascript实现广告的无缝滚动
- 通用乱码解决方案
- 分时系统
- Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果
- ios 如何让TableView加入横向滑动出现删除按钮的功能