#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;
}