关于C/C++中指针做形参的一点小分析(转)
2009-07-26 15:50
今天寝室的山东兄弟在练二级的上机,其中一个题目大概是这样:在一个函数中,有一个指针形参,记为*p,然后在函数内部定义了临时变量a,a和*p是同种类型。经过一系列计算 ,a得到了一个值,这个值最后是需要记录在指针*p里面的,应该怎么保存呢?我当时随便就说,p=&a。结果发生错误了,没有得到预期结果。正确答案是*p=a。
下面来分析下原因。
学过C的人都知道到,函数的实参与形参的之间是值传递,单向传递。在谭浩强那本C语言教材中就有这样一个经典的例子:
int a=3,b=4;
void exchange(int x,int y)
...{
int temp;
temp=a;a=b;b=temp; //试图交换a,b
}
exchange(a,b);
cout<<a<<" "<<b<<endl;
输出的来的仍然是3,4.
要交换a,b,只需改变函数exchange,传递a,b的地址,如下:
void exchange(int *x,int *y)
{
int temp;
temp=*x;*x=*y;*y=temp;
}
exchange(&a,&b);
cout<<a<<" "<<b<<endl;
这样,a,b就成功交换了。为什么呢?下面再说。
再回到开始提出的那个问题,为什么p=&a错误而*p=a正确呢?
再看两段代码:
#include<iostream>
using namespace std;
void test_point(int *p)
...{
int a=3;
p=&a; // 不同之处
}
int main()
...{
int x=4;
int *p1=&x;
test_point(p1);
cout<<*p1<<endl;
return 0;
}
此时输出的结果是4,也就是说,指针p1调用test_point函数后值并没有得到改变,接着看下一段代码
#include<iostream>
using namespace std;
void test_point(int *p)
...{
int a=3;
&nb
相关文档:
两个月前,也就是9月份,心血来潮在windows下实现了用C连接数据库,当时很是有把linux下一并给实现了。但是没有想得那么简单。这个任务一直推迟到了现在才完成,究其原因:1.我直接用eclipse开发工具,对于环境变量的设置不是很熟。2.linux系统库文件结构不熟悉,对于mysql提供的库文件没有放对 ......
As you may know, Oracle dropped support for Borland Compilers in OCI
some time back. Well, it isn't all that hard to set up again.
I'm running 9i Release 2 Enterprise Edition on this PC at work and I am
using Borland C++ Builder 6 to 'play' with OCI programming - I intend to
build a set of compo ......
Linux
下
C
开发——
gcc
,
gdb
的使用
作者:
zccst
我们学习的过程应该是一个积累的过程,有无到有,又少到多,而不能像下山的猴子。
9
月份的时候是第一次系统学习
gcc, gdb, makefile
(详见前面博客)。如今作为嵌入式系统的一个组成部分,决定重学一次,感觉理解加深了一些。
gcc
......
昨天才看到,但是遇到一些问题,今天解决了,记下……(参考:http://netbeans.org/kb/55/beginning-jni-part1.html)
我用的是Netbeans 6.7,但是和其他的也应该大同小异吧。 基本流程: Java这边的:
创建java文件(带native的),还要记得在类中加入:System.loadLibrary(xxx) 。
然后用javah来生成C/ ......
1.引言
本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。
许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样 ......