actanble

导航

C++学习第一弹: const 指针 引用答疑

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\n", c);//1

	printf("Press enter to continue ...");
	getchar();	
	return 0;
}

关于register、inline略。

posted on 2016-10-09 22:53  白于空  阅读(178)  评论(0编辑  收藏  举报