**

C语言中函数参数传递的方式:值传递,地址传递

**

值传递:将实参的值复制至形参的相应存储单元中,实参与形参占用不同存储单元,单向传递
地址传递:使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针的值,而形参接收到的是地址,
		  即指向实参的存储单元,形参和实参占用相同的存储单元
引用传递:C++中
主要内容:
	1> c语言中地址传递实参的方法
	2> 多函数嵌套传递实参的方法,二维指针
	3> 数组作为函数参数,而不改变数组的值,可以复制数组内容再进行修改
	   memcpy() 需要指定复制内容的长度,可以复制数组、结构体、类等
	   strcpy() 针对字符串,有'\0'结束标记
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// C语言中没有引用传递

void AddOwn(int *x)
{
	*x = *x + 100;
}


void TransCapital_1(char *str)
{
	int len = strlen(str);                 // strlen函数原型int strlen(char *);传入参数为地址,可计算传入数组的字符个数
	printf("len = %d\n", len);       // 输出为5,字符的个数
	int size = sizeof(str);               //sizeof
	printf("size = %d\n", size);     // 输出4,指针地址的大小

	for (int i = 0; i < strlen(str); i++)
	{
		str[i] = str[i] - 32;
	}

	printf("TransCapital_1 = %s\n", str);
}

//函数参数为数组,但不改变函数外部数组的值,需要将数组内容复制一份
void TransCapital_2(char str[])
{
	char str_[100];
	//memcpy需要指定复制内容的长度,可以复制数组、结构体、类等
	memcpy(str_, str, (strlen(str)+1)*sizeof(char));      //由于需要复制‘\0’所以需要在strlen后加1,避免str_乱码

	int len = strlen(str_);                 // strlen函数原型int strlen(char *);传入参数为地址,可计算传入数组的字符个数,‘\0’结束
	printf("len = %d\n", len);       // 输出为5,字符的个数
	int size = sizeof(str_);               //sizeof计算内存空间
	printf("size = %d\n", size);     // 输出100

	for (int i = 0; i < strlen(str_); i++)
	{
		str_[i] = str_[i] - 32;
	}

	printf("TransCapital_2 = %s\n", str_);
}

void swapRe(char **x, char **z)   //二维指针,x、y为指针的地址
{
	char *temp;
	temp = *x;
	*x = *z;
	*z = temp;
}


void swap(char **x, char **y, char **z)   //二维指针,x、y为指针的地址
{
	int len = strlen(*x);                 // strlen函数原型int strlen(char *);传入参数为地址
	printf("len = %d\n", len);       // 输出为6,字符的个数

	//交换x与y
	char *temp;
	temp = *x;            
	*x = *y;
	*y = temp;

	//交换y与z
	swapRe(y, z);         // 函数中的函数继续传递实参

	printf("\n");
}


int main()
{
	//简单的地址传递
	int a = 1;
	AddOwn(&a);
	printf("a=%d\n", a);
	printf("\n");

	//数组如何作为实参传递,改变外部数组的值
	char s[10] = {"hello"};  
	TransCapital_1(s);          //数组名作为函数的参数,传递数组的地址,形参和实参共同占用一段内存
	puts(s);
	printf("\n");

	//数组作为函数参数,但不改变外部数组的值
	char s2[10] = { "hello" };
	TransCapital_2(s2);          //数组名作为函数的参数,传递数组的地址,形参和实参共同占用一段内存
	puts(s2);
	printf("\n");

	char *ap = "AAAAAA";     
	char *bp = "BBBBBB";
	char *cp = "CCCCCC";

	swap(&ap, &bp, &cp);           //传递指针地址,传实参
	puts(ap);
	puts(bp);
	puts(cp);

	system("pause");
}
//***********输出结果***************
a=101

len = 5
size = 4
TransCapital_1 = HELLO
HELLO

len = 5
size = 100
TransCapital_2 = HELLO
hello

len = 6

BBBBBB
CCCCCC
AAAAAA
请按任意键继续. . .