const、指针、引用一直是C语言入门中的一个重难点;最近小有理解,赘述一番。
引用是链式法则的基础==> <T> *p = &q;*p,&p 产生的作用基本相同,都能作为实参被传递,取地址中data进行操作;理解好这一层,关于函数返回值是引用的也是同理,这里不赘述了。
理解引用取别名,就是将地址值0x001指向的那个*p->内存空间data取个别名; 那么跟多级指针的原理一样,指针本身也可以被引用,略。
而直接传递进去相当于变量p被copy了一份;将副本传递进去进行了操作。
举个栗子说明:
#include<iostream> #include <string> using namespace std; struct Teacher{ char name[64]; int age ; }; void printfT(Teacher *pT){ pT->age = 999; } //pT是t1的别名 ,相当于修改了t1 void printfT2(Teacher &pT){ cout << "before& "<<pT.age<<endl;//999 pT.age = 33; cout<<pT.age<<"__取别名函数__"<<endl;//33 } //pT和t1的是两个不同的变量 void printfT3(Teacher pT){ cout<<pT.age<<endl; pT.age = 45; //只会修改pT变量 ,不会修改t1变量 cout<<"after "<<pT.age<<endl;//45,带不出去 } void main() { Teacher t1; t1.age = 35; printfT(&t1); printfT2(t1); //pT是t1的别名 printfT3(t1) ;// pT是形参 ,t1 copy一份数据 给pT //---> pT = t1 system("pause"); return ; }这里我们要区分基本数据类型和引用数据类型,那么涉及指针和引用的操作我们就可以发现这种引用的处理,其性质等。C++一直都在贯穿这些概念,这些东西应该有意识去理解和接受。
关于C语言指针的深入了解可以点开下面的链接。
深入了解C语言指针
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。
关于引用本质的思考
1)引用在实现上,只不过是把:间接赋值成立的三个条件 [1定义两个变量 (形参实参);2建立关联实参取地址传给形参;3*p形参去间接的修改实参的值]的后两步和二为一;
//当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)
2)当我们使用引用语法的时,我们不去关心编译器引用是怎么做的
当我们分析奇怪的语法现象的时,我们才去考虑c++编译器是怎么做的
补充上const常引用注意的事项
1)Const & int e 相当于 const int * const e;
2)普通引用 相当于 int *const e1;
3)当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名;
4)使用字面量对const引用初始化后,将生成一个只读变量;
关于const和函数重载的结合举例:<这里有的用得还是C的printf不用在意,贴的代码>
/* 函数重载与函数指针 当使用重载函数名对函数指针进行赋值时 根据重载规则挑选与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型 */ #include<iostream> using namespace std; int func(int x) // int(int a){ return x; } int func(int a, int b){ return a + b; } //s指向一片内存,可以用字符串引用它; int func(const char* s){ return strlen(s); } typedef int(*PFUNC)(int a); // int(int a) int main(){ cout << "字符串_Hello-World_长度" <<func("HelloWorld") <<endl;//字符串长度10 int c = 0; PFUNC p = func; c = p(2); printf("c = %d ", c);//1 printf("Press enter to continue ..."); getchar(); return 0; }关于register、inline略。