说明:C语言中是没有引用的,c++中才有引用,本人的C语言的代码的文件后缀名是 .cpp。原因是c++语言的编译器兼容C语言
如果后缀名写成.c那么会有好多不便,尤其是老版本的c语言的编译器更是用起来气人。
引用:
定义:为对象起了另外一个名字,引用类型去引用另一种类型,通过将声明符写成&d的形式来定义引用类型,其中d是声明的引用类型的变量名。&d:表示引用变量中存储的内容(即引用所指向的变量的地址);d:表示以引用变量中存储的内容为地址的变量中的值。引用变量和指针变量一样都是存的所指向变量的地址,不同点指针自身变量自身有地址,而引用变量没有地址(系统为引用变量自身分配了地址,只不过引用变量自身的地址我们连读的权限都没有,所以我们默认引用自身没有地址,即引用类似常量),所不能声明引用的引用,也不能声明指向引用的指针,但是可以声明指向指针的指针,也可以声明指向指针的引用
引用的实质:从汇编的角度来看,当使用到一个变量的引用时,编译器就把变量的地址(即引用)直接压入堆栈,函数从堆栈中取出这个地址就可以操作这个变量了。所以说引用不是变量是对的,这只是内存空间的一个地址。引用的作用机理。
但是计算机真的就没有给引用用变量分配内存空间吗?其实引用变量系统是分配了内存空间的:当引用变量有所指向的时候,他就相当于一个操作受限的指针,引用的底层使用指针常量实现了让我们访问不到引用变量本身的地址,&r:表示引用变量中存储的内容(即引用所指向的变量的地址或者说被引用的目标变量的变量地址),r表示被引用目标变量的值。
&:什么时候当做引用标识符,什么时候当做取地址符
&出现在声明中时&当做是引用声明符,其他情况当做取地址符例如 i = 10; int &r = i;此时&是一个引用声明符
分析两端段代码:
int i= 10;
int j = 20;
int &r = i;
r = j;//引用变量的r实际是以引用变量r中存的内容为地址的变量中的值,实质r就是i
代码二
int a = 10;
int *p = &a;
*P =5;//*运算是以指针变量p中存的内容为地址的变量中的值
引用系统为其分配内存空间,引用变量和指针变量一样都是存址(引用变量中存储的是他所指向的变量的地址)
#include<stdio.h>
int main()
{
char k = 'a';
int i = 10;
double j = 20.0;
char &r = k;
char* p = &k;
int &r1 = i;//引用
int *p1 = &i;
double &r2 = j;
double *p2 = &j;
printf("======存地址的变量系统会分配4个字节===\n");
printf("char类型的引用变量分配了%d个字节\nchar*类型的指针变量分配了%d个字节\n",sizeof(&r),sizeof(p));
printf("int