`
113.com
  • 浏览: 81138 次
  • 来自: 广州
社区版块
存档分类
最新评论

C++中值传递、指针传递、引用传递的总结

    博客分类:
  • C++
阅读更多

 

欢迎访问拎图网


1. 值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

void swap(int a,int b)
{
     int temp;
     temp=a;
     a=b;
     b=temp;
     cout<<a<<’ ‘<<b<<’\n’;
}

int main(){
     int x=1;
    int y=2;
    swap(x,y);
    cout<<x<<’ ‘<<y<<’\n’;
    
    return 0;
}

用gdb调试后发现,x,y的地址分别是0xffbef938, 0xffbef934, 值分别是1,2。而形参a,b的地址分别是0xffbef918,0xffbef914, 虽然它们存储的值和x,y一样,都是1,2,但是这只是拷贝过来的。swap只交换了a,b,并不会改变x,y的值。输出为2,1;1,2

2. 指针传递:

void swap(int *a,int *b)
{
     int temp;
     temp=*a;
     *a=*b;
     *b=temp;
     cout<<*a<<’ ‘<<*b<<’\n’;
}

int main(){

   int x=1;
    int y=2;
    swap(&x,&y);
    cout<<x<<’ ‘<<y<<’\n’;

}

输出结果是2,1;2,1。实参x,y, 形参a,b的地址同上,但是a,b的内容分别为0xffbef938(x的地址),0xffbef934(y的地址),*a也就是0xffbef938内存中存放的内容,即x的值1。简单地说,a是一个指向外部实参地址的指针,*a是指针的内容,如果改变了*a也必然导致外部实参的改变。

3. 引用传递:

void swap(int &a,int &b)
{
     int temp;
     temp=a;
     a=b;
     b=temp;
     cout<<a<<’ ‘<<b<<’\n’;
}

int main(){
    
    int x=1;
    int y=2;
    swap(x,y);
    cout<<x<<’ ‘<<y<<’\n’;
    return 0;
}

输出是2,1;2,1。实参x,y的地址同上。然而与指针传递不同的是,形参a,b的地址也与x,y相同,即0xffbef938, 0xffbef934。这样一来,交换a,b就相当于交换x,y。

指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者。对比值传递,指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改,不像值传递将实参的值拷贝到另外的内存地址中才修改)。指针/引用传递的另外一种用法是:当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量,也相当于一个隐式的返回值传递吧。

至于指针/引用传递的格式,可以参考以下的内容:

int x=1;

int *y=&x; //用于指针传递,y有自己独立的内存地址,存储的内容是x的地址,*y是x的值

int &z=x; //用于引用传递,可以理解为z就是x,x就是z,只不过名字不一样

最后再啰嗦一个例子:

int change1(char* name){
    name=”alter”;
    return 1;
}

int change2(char* &name){
    name=”alter”;
    return 1;
}

int main(){
    char* string=”original!”;
    change1(string);
    cout<<string<<’\n’;

    change2(string);
    cout<<string<<’\n’;

}

结果:original!;alter。change1是值传递,形参name有自己独立的内存地址,内容是拷贝string的内容(string的内容是”original”的地址),修改后name的内容变成了“alter”的地址。change2是引用传递,形参name的地址就是string的地址,或者说name就是string

分享到:
评论

相关推荐

    Python中 传递值 和 传递引用 的区别解析

    在Python编程语言中,理解传递值(值传递)和传递引用(引用传递)的区别对于编写高效且符合预期的程序是非常重要的。Python中的参数传递机制与一些其他语言(如C++或Java)中的机制不同,这导致了在传递变量时可能...

    077李媛5

    总结来说,这次实验深化了对C语言中值传递和C++中引用传递的理解,通过实际操作,学生能够更好地掌握这两种参数传递机制,并学会在VS环境下编写、调试和分析程序。这对于理解和编写更复杂的程序逻辑至关重要。

    C++100道核心面试题

    C++中值传递主要有以下几种方式: - **值传递**:函数接收的是实参的副本,对形参的操作不会影响实参。 - **指针传递**:函数接收的是实参地址的副本,通过指针可以在函数内部修改实参。 - **引用传递**:函数接收的...

    C++基础知识详解与重点

    C++函数中值的传递方式有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference)。如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构...

    C++经典面试100题

    - **指针传递**:传递实参地址的拷贝,这种方式下,可以通过形参修改实参的值。 #### 10. 对于一个频繁使用的短小函数,在C语言中应该怎样实现,在C++中又应该如何实现? - **C语言**:使用宏定义可以提高运行效率...

    清华大学计算机系C++期末考试题及答案

    1. **解释C++中值传递和指针传递的区别。** - **解析**:在C++中,值传递是指在函数调用时将实际参数的值复制一份传入函数,这样不会影响到原参数的值;而指针传递则是将参数的地址传入函数,因此在函数内部对参数...

    C++历年面试经典题目

    4. C++函数中值的传递方式有哪几种? 知识点:传值、传引用(包括指针)。 5. 内存的分配方式有几种?他们分别是堆(new)、栈、自由存储区(malloc)、全局/静态存储区和常量存储区。 知识点:内存分配、堆、栈...

    C++面试试题大全

    - **指针传递**:通过传递实参的地址到形参。这种方式可以避免复制,从而提高效率,但需要小心管理指针,以避免出现悬空指针等问题。 - **引用传递**:通过引用传递,实际上是传递了实参的别名。这样既避免了复制,...

    电子类软硬件面试集锦

    答:C++函数的三种传递方式为:值传递、指针传递和引用传递。 2 头文件的作用是什么? 答:一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户...

    C++程序设计

    2. **指针变量的定义和引用**:指针变量的定义包括数据类型和指针标识符,通过解引用运算符*可以访问指针所指向的数据。 3. **指针与数组、字符串和函数的关系**:指针可以作为数组的索引,用于字符串的处理,还...

    c++练习题 (2).pdf

    选择题部分涉及到标识符的规则,`else`总是与最近未配对的`if`配对,`a[2][2]`在给定的数组初始化中值为6,`char **s`定义的是一个指针数组,`pa`是一个指向指针的指针,每个指针可以指向一个int型变量。这些题目...

    C++试卷及答案.doc

    题目要求删除链表中值在a到b之间的节点,这部分需要编写C++代码来实现,具体实现未给出,通常会涉及到链表遍历和删除节点的逻辑。这里需要补充的是,删除操作应确保不破坏链表的结构,同时处理边界情况。

    C与C++面试题,很多公司的

    3. C++函数中值的传递方式:主要有传值(by value)和传引用(by reference)两种,还有传指针(by pointer)的方式,实际上也是通过引用传递。 4. 内存的分配方式:堆(heap)、栈(stack)、静态存储区(static ...

    C++/CLI Standard

    - **类型系统统一**:探讨 C++/CLI 中值类型和引用类型之间的区别和联系。 - **指针、句柄与 null**:讲解 C++/CLI 中指针、句柄和 null 值的概念及用法。 - **参数**:解释函数调用时参数传递的方式。 - **自动...

    高质量 C++/C 编程指南

    - **6.2 值传递与引用传递**: 分析了通过值或引用传递参数的不同之处。 - **6.3 不同类型的值传递**: 进一步讨论了不同类型值的传递方式。 - **6.4 函数指针**: 解释了函数指针的概念及其应用场景。 - **6.5 使用...

    C++入门资料

    #### 七、指针与引用 - **指针变量的定义与使用**:指针的概念及基本操作。 - **动态内存分配**:使用`new`和`delete`操作符进行动态内存管理。 - **指针运算**:指针的算术运算。 - **指针与常量**:指针与常量结合...

    面向对象程序设计(C++)_实验2.docx

    通过引用传递参数可以避免复制整个对象,提高程序效率。在需要修改函数外部的变量时尤为有用。 **示例代码:** ```cpp void Swap(char &a, char &b) { char temp = a; a = b; b = temp; } int main() { char a...

    WindowsMobile面试题(附答案)

    - 函数中值的传递方式有**传值**、**传引用**(或称传指针)和**传对象**(在面向对象语言中) - `#ifndef/#define/#endif`的作用是防止头文件被多次包含,确保代码的正确性 - 在关系数据库中,2NF(第二范式...

    专业试卷中兴\计算机专业试题(01

    8. 函数`QB`的功能是创建一个具有n个结点的链表,每个结点包含一个字符串,链表的头指针通过引用变量`f`返回。用户从键盘输入字符串,依次填入链表中。 JAVA部分未提供具体内容,无法展开详解。

Global site tag (gtag.js) - Google Analytics