c++中关于引用的问题。 如题,以下函数: pair<int,int&> y(1,i); x.insepackrt(y); cout << x[1];

C++函数——指针和引用类型的参数传递(上)
普通的函数形参:
void fun(int v1,int v2)
cout&&v1&&"\t"&&v2&&
这就是一个最基本的带有两个普通形参的void型函数,在函数的()中定义的两个变量就是函数的形参。在调用函数时,编译器用实参对形参初始化并运行程序,需要指出的是形参只是实参的副本,这一过程中形参的可以重新赋值,而实参的值不会相应发生变化,可以举个例子:
void fun(int v1,int v2)
int num=v1;v1=v2;v2=
cout&&v1&&"\t"&&v2&&
int main()
int num1=10;int num2=20;
fun(num1,num2);
cout&&num1&&"\t"&&num2&&
这个例子证明了对形参的重新赋值不会改变实参的值,这就是最基本的函数参数传递,这里不再做详细讨论,下面我想说的是指针的形参是指针类型和引用类型的情况
一.指针形参的传递(非引用形参的传递)
函数的参数可以是指针,它与普通类型的形参一样,形参的任何改变只作用于形参局部副本,也就说是当对形参重新赋值时,函数的实参不会发生变化
void fun(int *p,int *q)
cout&&*p&&"\t"&&*q&&
int num=*p;
cout&&*p&&"\t"&&*q&&
cout&&p&&"\t"&&q&&
int main()
int num1=10;int num2=20;
int *ptr1=&num1;int *ptr2=&num2;
cout&&num1&&"\t"&&num2&&
cout&&ptr1&&"\t"&&ptr2&&
fun(ptr1,ptr2);
cout&&num1&&"\t"&&num2&&
cout&&ptr1&&"\t"&&ptr2&&
运行结果:
0x22ff74 0x22ff70
0x22ff74 0x22ff70
这是在我机器上运行的结果,当然了,你运行的是时候可以能得到的地址值是不一样的,因为他在内存中分配的空间不同,得到的结果当然不会相同,不过这个不关键,我们来看,由于函数为指针类型的形参,为了容易理解,我们在调用函数之前先输出num1,num2以及指针ptr1,ptr2的值以便比较,让我们来看函数部分,我通过中间量交换了*p与*q的值并输出他们两个值,然后我又将两个形参赋值为0,并输出其值,然后调用函数之后,我又输出了num1,num2以及实参ptr1,ptr2的值,从运行结果中我们发现,与普通形参调用不同的是num1与num2的值发生了变化,相同的是实参没有变化,而且形参的一切操作都没有改变实参的值(函数中我将形参重新赋值了,形参发生了变化,但从运行结果中可以看出,实参没有发生变化)。我们来总结一下,调用形参为指针类型的函数时,实参必须是指针(或者是取地址操作后的对象如&num1,&num2),在编译时,函数的形参用主调函数所给的实参初始化,以本例解释也就是说,编译时系统将p初始化为ptr1的副本,它内部存储的地址与ptr1存储的地址相同,也就是说*p与*ptr1指向的是同一个对象,因此当对*p和*q交换值时实际上是交换了它们所指向的对象的值,也就是交换了num1和num2的值,继而我将p和q赋值为0,目的是改变形参,输出他们的值以便与比较。然后在调用完函数之后,我在主调函数中输出了实参ptr1和ptr2的值,以及num1和num2的值,通过运行结果,我们就发现了我们的推断都是正确的!那就是:任何对非引用形参的操作都不会改变实参的值,即使是指针类型的形参!
值得提出的是,指针形参的操作固然有好处,但如果我们不想改变实参所指对象的值,那又该怎么办呢?这时我们需要const关键字,我们先这样,你可以将上面程序的函数形参定义为const类型运行并看报错,你会发现*p=*q;*q=操作是不合法的,这是因为const关键字的作用!大家都知道,当对定义指针指向const类型对象或者定义const类型对象的引用时,需要在指针前加const,即const
int a=1;const int *p=a; const int& b=a;但如果我们这样int a=1;const int
*p=a; const int& b=a;会产生什么结果呢?(大家知道的是const int *与int *const
是不同的,这里不做详细解释,可以参考本blog知识点文章——“学习标准C++Primer过程中发现的几个需要注意的问题”)首先const
int *p=a; const int&
b=a;此操作使得程序不能通过*p或者b来修改a的值(当然了,a的值仍然是可以改变的,例如直接赋值或者通过其他指针或者引用),根据这一现象,我们在函数的形参上加const,就确保了函数中所有改变指针所指对象值的操作都是非法的,这样就实现了这一功能。可以参考如下程序
void fun(const int *p,const int *q)
cout&&*p&&"\t"&&*q&&
cout&&p&&"\t"&&q&&
int main()
int num1=10;int num2=20;
int *ptr1=&num1;int *ptr2=&num2;
fun(ptr1,ptr2);
cout&&ptr1&&"\t"&&ptr2&&
运行结果:
0x22ff74 0x22ff70
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2013年计算机二级考试C++上机模拟应用题及答案5
1请编写函数fun,其功能使:计算并输出给定数组(长度为9)中每相邻两个元素之平均值的平方根之和。&
double&fun(double&x[9])
double&sum=0.0;
int&I,j=1;
for(i=0;i<9;i++)
sum+=sqrt((x[i]+x[i+1])/2.0);
2请编写函数fun,其功能是:计算并输出下列多项式值:
s=1+1/(1+2)+1/(1+2+3)+..1/(1+2+3&+50)&
double&fun(int&n)
double&sum=0.0,&t;
for(i=1;i<=n;i++)
for(j=1;j<=I;j++)
sum+=1.0/t;
} 来自www.Examw.com
3请编写函数fun,它的功能是:计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。&
double&fun(int&n)
double&sum=0.0;
for(i=1;i<=n;i++)
if(i%5==0&||&i%9==0)
sum+=1.0/I;
4请编写函数fun&,其功能是:计算并输出3到n之间所有素数的平方根之和。&
double&fun(int&n)
int&m,k,I;
double&s=0.0;
for(m=3;m<=n;m++)
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)&
if(i&=k+1)
s+=sqrt(m);
5请编写函数fun,其功能是:计算并输出&s=1+(1+2(0.5))+(1+2(0.5)+3(0.5))+&+(1+2(0.5)+3(0.5)+&+n(0.5))&
double&fun(int&n)
double&=1.0,p=1.0;
for(i=2;i<=n;i++)
{中&华 考&试 网
p+=pow(I,0.5);
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'c++期末考试习题班级1_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
c++期末考试习题班级1
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩12页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢c++中使用c的函数,使用出问题了,求大神解释。_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:246,516贴子:
c++中使用c的函数,使用出问题了,求大神解释。收藏
编译环境是 VS2015 系统是win7 64位一个solution下建立了两个工程,一个C工程,一个C++工程。C工程代码如下://**.h#ifndef __export_func_h__#define __export_func_h__#ifdef __cplusplusextern &C& {#endifvoid
testHellodWorld();#ifdef __cplusplus}#endif#endif
//**.c#include &stdlib.h&#include &stdio.h&#include &ExportFunc.h&void
testHellodWorld() {printf(&hello world!&);}c++工程如下:#include &stdafx.h&#include &iostream&#include &ExportFunc.h&int main(){testHellodWorld();//std::cout && &hello world& && std::system(&pause&);
return 0;}debug报的错是:ErrorLNK2019unresolved external symbol _testHellodWorld referenced in function _mainImportFuncD:\temp\InExportFunc\ImportFunc\ImportFunc.obj1ErrorLNK11201 unresolved externalsImportFuncD:\temp\InExportFunc\Debug\ImportFunc.exe1貌似是链接时出的问题,求大神解决。。。。
0基础电脑培训——变身高富帅!
只好自己顶一下了。。。。。。
放在同一个工程里
你那个C的函数,是放到dll里了吗?如果是的话,应该导出一下。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或C++引用作为函数形参的问题,程序如下:_百度知道

我要回帖

更多关于 amp gt amp lt 的文章

 

随机推荐