引用
- **引用的语法**
- **引用的注意事项**
- **数组的引用**
- **引用的本质**
- **尽量用const来代替define**
- **指针的引用**
1.引用是做什么:和C语言的指针一样的功能,并且使语法更加简洁
2.引用是什么∶引用是给空间取别名
引用的语法
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
void test01()
{
//引用
int a = 10;
int &b = a;//给a的空间取别名叫b
b = 100;
cout << a << endl;
//指针
//int a1 = 10;
//int *p = &a;
//*p = 100;
}
//void func(int *a)
//{
// *a = 200;
//}
void func(int &a)//int &a=a
{
a = 200;
}
void test02()
{
int a = 10;
cout << "a=" << a << endl;
//func(&a);
func(a);
cout << "a=" << a << endl;
}
int main()
{
//test01();
test02();
system("pause");
return EXIT_SUCCESS;
}
引用的注意事项
&在此不是求地址运算,而是起标识作用。
类型标识符是指目标变量的类型,
必须在声明引用变量时进行初始化。
引用初始化之后不能改变。
不能有 NULL引用。必须确保引用是和一块合法的存储单元关联。
建立对数组的引用。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{
//1、引用创建时必须要初始化
//int &a;err
//2、引用一旦初始化不能改变它的指向
int a = 10;
int &pRef = a;
int b = 20;
pRef = b;//赋值操作
cout << &a << endl;
cout << &pRef << endl;//地址一样
cout << &b << endl;
system("pause");
return EXIT_SUCCESS;
}
数组的引用
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main()
{
int arr[] = { 1,2,3,4,5 };
//第一种方法
//1、定义数组类型
typedef int(MY_ARR)[5];//数组类型
//2、建立引用
MY_ARR &arref = arr;//建立引用
//第二种方法
//直接定义引用
int(&arref2)[5] = arr;
//第三种方法
typedef int(&MY_ARR3)[5];//建立引用数组类型
MY_ARR3 arref3 = arr;
for (int i = 0; i < 5; i++)
{
cout << arref[i] << endl;
}
cout << endl;//换行
for (int i = 0; i < 5; i++)
{
arref2[i] = 100 + i;
cout << arref2[i] << endl;
}
system("pause");
return EXIT_SUCCESS;
}
引用的本质
引用的本质在c++内部实现时一个常指针
Typer &ref=val; //相当于 Type* const ret=&val;
尽量用const来代替define
用define是不能够进行类型的检测的
而const时可以进行类型检测的
const和#define区别总结:
1、const有类型,可进行编译器类型安全检查。#define无类型,不可进行类型检查
2、const有作用域,而#define不重视作用域,默认定义处到文件结尾.如果定义在指定作用域下有效的常量,那么#define就不能用。
指针的引用
c语言下的操作如下所示:
https://blog.csdn.net/m0_69093426/article/details/130178619
c语言下,被调函数申请一块堆区的空间,主调函数用这块空间需要高级的指针(二级指针)
c++下的操作如下所示
执行char mp=NULL,然后执行char * &tmp=mp,mp是char类型,这部相当于把char*类型的mp取了别名叫tmp,然后就是字符串操作,再然后执行tmp=p,就是把p里面的值赋值给tmp,就能打印出小花了。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
void test01()
{
char* p =(char *)"翠花";
char * &p1 = p;
cout << p1 << endl;
}
//c语言下
//被调函数申请一块堆区的空间,主调函数用这块空间需要高级的指针(二级指针)
//或者通过返回值
//被调函数
//void func(char* *tmp)
void func(char* &tmp)
{
char *p;
p=(char *)malloc(64);
memset(p, 0, 64);
strcpy(p, "小花");
//*tmp = p;
tmp = p;
}
//主调函数
void test02()
{
char *mp = NULL;
//func(&mp);
func(mp);
cout << mp << endl;
}
int main()
{
//test01();
test02();
system("pause");
return EXIT_SUCCESS;
}