C++中的指针与引用、如何参数传递

C++语言中,函数的参数和返回值的传递方式有3种:引用传递、指针传递和值传递。

1、引用传递

引用传递传递的是引用对象的内存地址。

引用传递的特点是:被调函数对形参的任何操作都会影响主调函数中的实参变量。

举例说明:

#include<iostream>

using namespace std;

void swap3(int &p,int &q)
{
	int temp;
	temp =p;
	p=q;
	q=temp;
	cout<<p<<" "<<q<<endl;
}

int main()
{
	int x=1,y=2;
	swap3(x,y);
	cout<<x<<" "<<y<<endl;
}

该函数的功能就是交换x和y。

2、指针传递

指针是用来控制对象的内存地址的,它指向单个对象的地址,除了void指针类型外,指针的数据类型与所指向地址的变量数据类型须保持一致。

指针传递只需交换地址即可,举例如下:

#include<iostream>

using namespace std;

void swap2(int *p,int *q)
{
	int temp;
	temp =*p;
	*p=*q;
	*q=temp;
	cout<<p<<" "<<q<<endl;
}

int main()
{
	int x=1,y=2;
	swap2(&x,&y);
	cout<<x<<" "<<y<<endl;
}

该函数的功能就是交换x和y。

3、值传递

值传递是指将要传递的值作为一个副本传递。

在函数调用时,实参把它的值传递给对应的形参,方法执行中形参值不影响实参,即实参的值不会发生改变。即值传递的特点:被调函数对形参的任何操作都是作为局部变量进行的,不会更改主调函数的实参变量的值。

举例说明:

#include<iostream>

using namespace std;

void swap1(int p,int q)
{
	int temp;
	temp =p;
	p=q;
	q=temp;
	cout<<p<<" "<<q<<endl;
}

int main()
{
	int x=1,y=2;
	swap1(x,y);
	cout<<x<<" "<<y<<endl;
}

在此例子中,swap1输出的p和q分别是2,1,但是主函数中输出的值仍不变,分别为1和2。

4、引用传递、指针传递和值传递的区别与联系

(1)、值传递与引用的区别

值传递传递的是值的一个副本,函数对形参的操作不会影响实参的值;而引用传递传递的是引用对象的地址,函数的形参操作会直接影响实参的值,实参的值随着形参的值的改变而改变

(2)、指针与引用的区别

指针是一个实体,而引用是一个别名,指针可以为空,即空指针,但引用不能为空;

引用初始化时必须指向一个对象,之后不能变(但是对象其内容可变),而指针可变;

指针使用前须测试其合法性,防止为空,但引用不要测试其合法性;

引用无需解引用,但指针需要解引用;

sizeof引用得到的是所指对象的大小,而sizeof指针得到的是指针本身的大小,即对象地址的大小;

指针自增与引用自增意义不一样;

在内存分配上,程序为指针变量分配内存区域,而引用不需要分配内存区域等。

时间: 2024-10-27 23:12:14

C++中的指针与引用、如何参数传递的相关文章

详解Java中的指针、引用及对象的clone

对象|详解 Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它们的区别.优点及缺点.看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的

C++中的指针与引用详细解读

1.指针和引用的定义 在深入介绍之前我们首先来看一下指针和引用的定义.指针和引用的区别,然后分别针对指针和引用展开讨论,深入细节为何有这些差异. 指针的权威定义: In a declaration T D where D has the form * cv-qualifier-seqopt D1 And the type of the identifier in the declaration T D1 is "derived-declarator-type-list T", then

C++中的指针与引用

写在前面 指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作.但是什么时候使用指针?什么时候使用引用呢?这两 者很容易混淆,在此我详细介绍一下指针和引用,力争将最真实的一面展现给大家.如果我喷得不够好,希望嘴下留情.手下留命,还请指点一二:如果感觉还不 错,请大家鼓掌. 1.指针和引用的定义 在深入介绍之前我们首先来看一下指针和引用的定义.指针和引用的区别,然后分别针对指针和引用展开讨论,深入细节为何有这些差异. 指针的权威定义: In a declara

向函数中传递指针和传递指针的引用的区别

如果是传递指针,那么会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针:但 是对于传递指针应用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再 引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了   看个例子: #incl

C++中指针和引用的区别分析_C 语言

从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调

JAVA中的指针,引用及对象的clone

Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它们的区别.优点及缺点. 看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于

java及C++中传值传递、引用传递和指针方式的理解_java

java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); System.out.println( buffer); } public static void SChange (StringBuffer str) { st

c++-C++中使用指针引用的问题

问题描述 C++中使用指针引用的问题 #include #include using namespace std; struct BSTNode { BSTNode left; BSTNode *right; int data; BSTNode(int value){ data=value; left=NULL; right=NULL; } }; class BST{ public: BST(){ root=NULL; } void insert(BSTNode *&ptr,int value)

C/C++中指针和引用之相关问题深入研究_C 语言

一.基本知识指针和引用的声明方式:声明指针: char* pc;声明引用: char c = 'A'   char& rc = c; 它们的区别:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变.这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象.但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变. ②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对