引用类型与函数

引用类型的定义与使用

引用时已有变量或表达式的一种别名机制,主要用于函数的参数和返回值。

引用定义时必须初始化。初始化后不能再指向其他的变量。

引用的本质上是在C++内部实现一个指针常量。

	int a = 10;
	
	//	定义引用b并初始化为a; 
	int& b = a;

	//	b是a的别名,通过b可以访问到a的值
	cout << "b: " << b << endl;

	//	a的值发生改变,b的值也会改变;b的值发生改变,a的值也会改变。
	b++;
	cout << "b: " << b << " a: " << a << endl;
	a++;
	cout << "b: " << b << " a: " << a << endl;

	int c = 20;
	//	把c的值赋给b。
	b = c;
	cout << "b: " << b << " a: " << a << endl;

函数

在程序设计时,如果一段代码重复进行某个操作或完成特定的功能,则将这样的代码组织称为函数。

/*
	函数的定义
		函数定义由函数类型、函数名和函数参数组成,称为函数头。函数名要满足标识符命名规则。  
		由两个大括号括起来的语句组称为函数体。  
	函数类型与返回值
		函数可以有返回值也可以没有返回值。
		有返回值时,函数类型就是返回值的类型;没有返回值时,函数类型是void。
		函数类型可以是C++支持的任意类型。
	函数参数
		形参(形式参数),定义函数时,括号中的参数。
		实参(实际参数),调用函数时,括号中的参数。	
*/

int mySum(int n)  // n是形参
{
	int sum = 0;
	for (int i = 1; i <= n; i++)
	{
		sum += i;
	}
	
	return sum;
}

void myShow()	 // 函数可以没有返回值,此时函数类型时void
{

	cout << "Hello!" << endl;	
	
}

//	求两个书中较大的值
int myMax(int a, int b);

int main()
{
	int n = 5;
	//	函数调用
	int m = mySum(n); // n是实参
	cout << "m: " << m << endl;	
	
	cout << max(10, 20) << endl;
	cout << max(20, 10) << endl;
	return 0;
}

int myMax(int a, int b)
{
	if (a > b)
	{
		return a;
	}
	return b;
}

函数的参数传递

在函数调用时,系统为形参分配内存单元,并将实参的值传到形参的单元中。根据函数功能的需要,函数参数可以选择数值,指针或引用三种形式之一。

数值作为函数的参数传递给函数时,实参与形参占用不同的存储单元,实参的值赋给形参。

void mySwap(int a, int b);

int main()
{
	int a = 10, b = 20;
	mySwap(a, b);
	cout << "main a: " << a << " b: " << b << " &a: " << &a << " &b: " << &b << endl;		
	return 0;
}

void mySwap(int a, int b)
{
	int tmp = a;
	a = b;
	b = tmp;
	cout << "mySwap a: " << a << " b: " << b << " &a: " << &a << " &b: " << &b << endl;
}

指针作为函数的参数,传递的是变量的地址。

void mySwap(int* p1, int* p2);

int main()
{
	int a = 10, b = 20;
	int* p1 = &a, * p2 = &b;
	cout << "main a: " << a << " b: " << b << " &a: " << &a << " &b: " << &b << " &p1: " << &p1 << " &p2: " << &p2 << endl;
	mySwap(p1, p2);
	cout << "main a: " << a << " b: " << b << " &a: " << &a << " &b: " << &b << " &p1: " << &p1 << " &p2: " << &p2 << endl;

	return 0;
}

void mySwap(int* p1, int* p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
	cout << "mySwap: &p1" <<  &p1 << " &p2: " << &p2 << endl;
}

引用作为函数的参数,传递的是变量的地址。

void mySwap(int& a, int& b);

int main()
{
	int a = 10, b = 20;
	mySwap(a, b);	
	return 0;
}

void mySwap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;	
}

数组作为函数的参数和返回值:数组名作为参数时,传递的数组的首地址。

//	数组名作为参数时,传递的数组的首地址。
void func1(int* a, int len);

//	数组名作为参数时,形参也可以写成: 数组类型 形参名[]
void func2(int a[], int len);

void show(int* a, int len);

int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	//	数组名作为参数时,传递的数组的首地址。
	func1(a, 5);
	show(a, 5);
	//	func1(a[3], 2); func1的第一个参数是整型指针,不能传入整型数据

	//	func1的第一个参数也允许传入某个数组元素的地址
	func1(&a[3], 2);
	show(a, 5);

	func2(a, 5);
	show(a, 5);
	func2(&a[3], 2);
	show(a, 5);

	return 0;
}

void func1(int* a, int len)
{
	for (int i = 0; i < len; i++)
	{
		a[i] += 1;
	}
}

void func2(int a[], int len)
{
	for (int i = 0; i < len; i++)
	{
		a[i] += 1;
	}
}

void show(int* a, int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << a[i] << ", ";
	}
	cout << endl;
}

C++中函数不能直接返回一个数组,但是可以通过指针来实现返回一个数组。

int* func1();
void show(int* a, int len);

int main()
{
	int* a = func1();
	show(a, 15);
	
	delete[]a;
	return 0;
}

int* func1()
{
	//int a[15] = { 1, 2, 3, 4, 5 };
	int* a = new int[15] ;
	for(int i = 0; i < 5; i++) 
	{ 
		a[i] = i;
	}
		
	show(a, 15);
	return a;
}

void show(int* a, int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << a[i] << ", ";
	}
	cout << endl;
}

变量的生命周期

变量的作用范围

局部变量

函数内部定义的变量(也称为局部变量),只在函数范围内有效。

全局变量

函数外部定义的变量称为全局变量,在程序运行过程中有效。

在一段程序中,如果出现同名的全局和局部变量,则优先访问局部变量。
//	全局变量
int i = 100;

void func();

int main()
{
	//	局部变量
	int i = 20;
	func();
	//	当存在和全局变量同名的局部变量时,使用局部变量
	cout << "main i: " << i << endl;
	//	当存在和全局变量同名的局部变量时,可以通过 ::变量名 使用全局变量
	cout << "main ::i: " << ::i << endl;
	return 0;
}

void func()
{
	//	使用全局变量
	cout << "func i: " << i << endl;
	i++;
}

变量的存储类别

动态存储方式,在程序执行过程中,根据需要动态分配存储空间。

静态存储方式,在程序运行期间,分配固定的存储空间并且一直存在。

有static关键字的变量,是静态存储的。
int func(int n);

int main()
{
	cout << func(1) << endl;
	cout << func(2) << endl;
	cout << func(3) << endl;
	cout << func(0) << endl;
	cout << func(10) << endl;
	return 0;
}


int func(int n)
{
	static int f = 1;
	f *= n;
	return f;
}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值