C++ 函数参数传递 值传递,引用传递,地址传递


#include<iostream>
using namespace std;
#include<assert.h>
#include <string>


//复杂链表结构体
struct ComplexLinkNode
{
	int data;
	ComplexLinkNode *m_pNext;
	ComplexLinkNode *m_pSibling;
};

//ComplexLinkNode* 类型的参数传递
void test(ComplexLinkNode *pHead)
{
	//给pHead赋值
	pHead->data = 5;
	//申请一个新结点
	ComplexLinkNode *pNode = new ComplexLinkNode();
	pNode->data = 6;
	//修改pHead的指向
	pHead = pNode;

}
//ComplexLinkNode* 类型的引用传递
void test2(ComplexLinkNode *&pHead)
{
	//给pHead赋值
	pHead->data = 5;
	//申请一个新结点
	ComplexLinkNode *pNode = new ComplexLinkNode();
	pNode->data = 6;
	//修改pHead的指向
	pHead = pNode;

}
//ComplexLinkNode* 类型的地址传递
void test3(ComplexLinkNode **pHead)
{
	//给pHead赋值
	(*pHead)->data = 5;
	//申请一个新结点
	ComplexLinkNode *pNode = new ComplexLinkNode();
	pNode->data = 6;
	//修改pHead的指向
	*pHead = pNode;

}

//int 
//参数传递
void change(int c)
{
	c = 3;
}
//引用传递
void change2(int &c)
{
	c = 3;
}
//地址传递
void change3(int *c)
{
	*c = 3;
}

//int*
//参数传递
void change(int *c)
{
	*c = 3;
}
//引用传递
void change2(int *&c)
{
	*c = 3;
}
//地址传递
void change3(int **c)
{
	**c = 3;
}

//char 
//参数传递
void change(char c)
{
	c = 'c';
}
//引用传递
void change2(char &c)
{
	c = 'c';
}
//地址传递
void change3(char *c)
{
	*c = 'c';
}

//char* //不能改变内容,可以改变其地址
//参数传递
void change(char *c)
{
	c = "cc";
}
//引用传递
void change2(char *&c)
{
	c = "cc";
}
//地址传递
void change3(char **c)
{
	*c = "cc";
}

//char [] //相当于char *const 
//参数传递
void change11(char *c)
{
	cout << (c) << endl; //aa
	*(c + 1)= 'd';
	//c = "cc";
}
//引用传递
void change12(char *&c)
{
	c = "cc";
}
//地址传递
void change13(char **const c)
{
	*c = "cc";
}


void change(string *s)
{
	//cout << "c1:" << *s << endl;
	*s = "sss";
	//cout << "c2:" << *s << endl;
}



int main(void)
{
	//int
	cout << "int : " << endl;
	int a = 1;
	change(a);
	cout << "参数传递:" << a << endl;  //1

	change2(a);
	cout << "引用传递:" << a << endl;  //3

	change3(&a);
	cout <<"地址传递:"<< a << endl;    //3

	//int* 
	cout << "int* : " << endl;
	//由于ab本身就是一个指针常量,所以三种传递方式都可以更改其值
	int ab[] = { 1 };    
	int *aa = ab;

	change(aa);
	cout << "参数传递:" << *aa << endl;  //3

	change2(aa);
	cout << "引用传递:" << *aa << endl;  //3

	change3(&aa);
	cout << "地址传递:" << *aa << endl;  //3


	////////////////////////////////
	//char
	cout << "char : " << endl;
	char c = 'a';
	change(c);
	cout << "参数传递:" << c << endl;  //'a'

	change2(c);
	cout << "引用传递:" << c << endl;  //'c'

	change3(&c);
	cout << "地址传递:" << c << endl;  //'c'
	
	//char* //相当于const char*
	cout << "char* : " << endl;
	char *cb = "ab"; //相当于const char*cc
	//cout << cc[0] << endl;
	
	change(cb);
	cout << "参数传递:" << cb << endl;  //ab

	change2(cb);
	cout << "引用传递:" << cb << endl;  //cc

	change3(&cb);
	cout << "地址传递:" << cb << endl;  //cc
	
	//char [] //相当于char *const 
	cout << "char []" << endl;
	char cc[] = { 'a', 'a', '\0' }; //相当于char * const cc
	change11(cc);
	cout << "参数传递:" << cc << endl; //ad

	//change12(cc);
	//cout << "引用传递:" << cc << endl;

	//change13(cc);
	//cout << "地址传递:" << cc << endl;


	//string 与 int 相同
	string s = "ss";
	string *ss = &s;
	change(&s);
	//s.append("ss");
	cout << s << endl;  
	cout << *ss << endl;
	
	//结构体类型 由于test(ComplexLinkNode* pHead)的函数参数为ComplexLinkNode*类型,
	//而调用函数时参数也是ComplexLinkNode*类型,此时函数调用跟参数传递方式一样.
	//此时可以修改pHead的内容,
	//也可以修改pHead的指向,但是在函数退出时pHead指向不会改变.
	cout << "结构体:" << endl;
	ComplexLinkNode *TC = new ComplexLinkNode();
	test(TC);
	cout << TC->data << endl;  //5
	//要想让传递的pHead可以修改指向,则可以使用引用传递,指针传递
	//引用传递
	test2(TC);
	cout << TC->data << endl;  //6
	//地址传递
	test3(&TC);
	cout << TC->data << endl;  //6

	return 0;
}


猜你喜欢

转载自blog.csdn.net/mayi_xiaochaun/article/details/49004271