• 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
    ", c);//1
    
    	printf("Press enter to continue ...");
    	getchar();	
    	return 0;
    }

    关于register、inline略。

  • 相关阅读:
    Linux中yum命令镜像源和出错解决方案
    Redis编译安装
    Linux下安装Redis
    zabbix3.4.2的安装及配置
    【前端】活动表单
    【笔记】archlinux缺少部分常用工具
    【笔记】BootstrapTable带参数刷新数据的坑
    【笔记】Win7连接公司内网无法打开网页
    【笔记】Archlinux下配置rsyslog写日志到mysql
    【笔记】Gave up waiting for suspend/resume device
  • 原文地址:https://www.cnblogs.com/actanble/p/6713444.html
Copyright © 2020-2023  润新知