引用
是内存空间另外一个别名,相当于门牌号,可以用它来找到具体的内存空间。
int i = 17;
int &b = i;
cout << b << endl;
指针
指针指向一块内存,它的内容是所指内存的地址
int i = 17;
int* p = &i; //指针
cout << *p << endl;
引用和指针的区别
- 指针是一个实体,而引用仅是个别名;
- 引用使用时无需解引用(*),指针需要解引用;
- 引用只能在定义时被初始化一次,之后不可变;指针可变;
- 引用没有 const,指针有 const,const 的指针不可变;
- 引用不能为空,指针可以为空;
sizeof 引用
得到的是所指向的变量(对象)的大小,而sizeof 指针
得到的是指针本身(所指向的变量或对象的地址)的大小。- 指针和引用的自增(++)运算意义不一样;
值交换
指针值交换
void swap_1(int *a,int *b){
int c = 0;
c = *a;
*a = *b;
*b= c;
}
引用值交换
void swap_2(int &a,int &b){
int c = 0;
c = a;
a = b;
b = c;
}
引用的主要功能:作为函数的参数或返回值
struct Treacher{
char* name;
int age;
};
void myprint(Treacher &t){
t.age = 21;
cout << t.name << "," << t.age << endl;
}
指针作为函数的参数或返回值就稍微要麻烦一些
void myprint2(Treacher *t){
t->age = 22;
//(*t).age = 22; //和t->age相同
cout << t->name << "," << t->age << endl;
}
二级指针和指针引用
二级指针
void getTeacher(Teacher **p){
Teacher *tem = (Teacher *)malloc(sizeof(Teacher));
tem->age = 20;
*p = tem;
}
指针引用,代替二级指针
void getTreacher2(Treacher* &p){
p = (Treacher *)malloc(sizeof(Treacher));
p->age = 20;
}
指针常量与常量指针
指针常量,指针的常量,不改变地址的指针,但可以修改指向的内容
常量指针,指向常量的指针,内容不能修改
void main9(){
//指针常量,指针的常量,不改变地址的指针,但可以修改指向的内容
int a = 2, b = 3;
int *const p1 = &a;
//p1 = &b; //指针常量, 无法改变地址
*p1 = 4; //可以这样改变
//常量指针,指向常量的指针,内容不能修改
const int *p2 = &a;
p2 = &b; //可以这样改变
//*p2 = 9; //常量指针,无法改变内容
}
引用的大小
struct Treacher{
char* name;
int age;
};
void main(){
Treacher t;
Treacher &t1 = t;
Treacher *p = &t;
cout << sizeof(t1) << endl; //引用是结构体内所有字段大小的综合 char* 4字节,int 4字节,总共8字节
cout << sizeof(p) << endl; //指针是4
system("pause");
}