23 一般引用的用法

(1)代码

 #include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
int a = ;
int b = ;
int &rn = a;//声明rn为变量a的引用
int equal; rn = b;//rn是a的别名 也就是b赋值给rn实际上就是修改了a的值 引用不用开辟内存单元
cout << "a=" << a << endl;//
cout << "b=" << b << endl;// rn = ;
cout << "a=" << a << endl;//
cout << "b=" << b<< endl;// equal = (&a == &rn) ? : ;
cout << "equal=" << equal << endl;// getchar(); return ; }

(2)分析

  a:rn其实是a的一个别名,对rn的赋值实际上就是对a的赋值,因此执行完赋值以后,a的值就是b的值

b:rn声明为a的引用,不需要为rn另外开辟内存单元,它们占用的是同一个存储单元

24 指针变量的引用

(1)代码

 #include <stdio.h>
#include <iostream> using namespace std; int main()
{
int a = ;
int b = ;
int *p = &a;//指向整形变量aa的p
int* &pa = p;//p的指针引用pa (*pa)++;//pa+1实际上就是对p指向的内容加1 也就是a+1 所以a=2
cout << "a=" << a << endl;//
cout << "b=" << b<< endl;//
cout << "*p=" << *p << endl;// pa = &b;//pa是p的引用 所以p也指向了b的地址
(*pa)++;//实际上就是对p指向的内容加上1
cout << "a=" << a << endl;//
cout << "b=" << b << endl;//
cout << "*p=" << *p<< endl;//
getchar();
return ; }

(2)分析

  a:声明p的一个指针引用pa,pa指向的内容+1,因为pa是p的引用,所以实际上是对p指向的内容加1也就是a+1结果为2

  b:pa指向变量b的地址,因为pa是p的引用,所以此时p也指向b的地址

25 看代码找错误

(1)代码

 #include <stdio.h>
#include <iostream> using namespace std;
int main(int argc, char** argv)
{ int a = ;
int b = ;
//int &c;引用声明必须初始化
//int &d = a;
//&d = b;引用只能在声明的时候赋值
//int *p;
//*p = 5;因为p没有初始化 野指针 getchar();
return ; }

(2)分析

  a;引用类型的变量声明的同时必须初始化

  b:引用只能在声明的时候被赋值,以后不能用该引用名作为其他变量的别名

26 如何交换两个字符串

(1)代码

 #include <stdio.h>
#include <iostream> using namespace std;
//传递引用实现交换
void swap(char *&x, char *&y)
{
char *temp;
temp = x;
x = y;
y = temp;
} //使用二级指针处理方案
void swap1(char **x, char**y)
{
char *temp;
temp = *x;
*x = *y;
*y = temp;
}
int main(int argc, char**argv)
{
char *ap = "hello";
char *bp = "how are you";
cout << "ap:" << ap << endl;
cout << "bp:" << bp << endl; swap(ap, bp); cout << "swap ap bp" << endl;
cout << "ap:" << ap << endl;
cout << "bp:" << bp << endl;
swap1(&ap, &bp);
cout << "swap1 ap bp" << endl;
cout << "ap" << ap << endl;
cout << "bp" << bp << endl;
getchar();
return ;
}

(2)分析

  a:这是利用指针引用实现字符串的交换,也可以通过二维指针达到同样的目的

27 指针和引用有什么区别

  a:初始化不同,引用在创建的同时必须初始化,也就是引用的一个有效的对象那里

  b:可修改行不同,引用一旦被初始化指向一个对象,它就不能改变另一个对象的引用,也就是不要脚踏两只船。

  c:不存在NULL的引用,引用不能指向空值的引用

  d:测试需要的区别。引用不会指向空值,也就是不用测试他的有效性

28 为什么传引用比传指针更加的安全

  a:由于不存在空引用,并且引用一旦初始化为指向的一个对象后不能被改变为另一个对象的引用

29 复杂指针的声明

(1)

  a;int **a;//指向一个存储为指针的指针变量

  b:int *a[10];//一个有10个指向整型的指针的数组

  c:int (*a)[10];//一个指向有10个元素的整形数组的指针

  d:int (*a)(int);//一个指向函数的指针,这个函数有一个整型参数并返回一个整形数

  e:int (*a[10])(int);//一个有10个指针的数组,该指针指向一个函数,这个函数有一个整形参数并返回i一个整形数

(2)复杂情况的解析

  a:法则

    右左法则,首先从未定义的标识符开始看,然后看最里面的圆括号,然后看右边再看左边,遇到圆括号再掉转方向,解析完一个括号再跳出圆括号,重复过程

  b:eg1

    int (*func)(int *p)

      首先找到那个未定义的标识符,func,外面一层符号,而且左边是一个指针,所以func是一个指针;然后跳出圆括号发现右边是一个括号,说明(*func)是一个函数,而func是一个指向这类函数的指针,也就是函数指针,int*为形参

  c eg2

    int (*func)(int *p,int (*f)(int*))

      func被一个括号包含而且左边是一个*号,说明func是一个指针,跳出括号,右边又是一个括号,说明是一个指向函数的指针,这个函数形参一个是int*,一个是int (*)(int*),返回值是int *.类似的,f也是一个函数指针,指向函数具有int*类型的形参,返回值为int

  d:int (*func[5])(int *p)

      func右边是一个[]运算符,说明func是具有5个元素的数组.func左边有一个*,说明func是一个指针,因为[]运算符优先级比*高,所以func先和[]结合,因此*是修饰func[5]。跳出括号再看右边,也是圆括号,那么说明func数组元素是函数类型的指针,它指向的函数是int*类型的形参。

  e:int (*(*func)[5])(int *p)

      func是一个圆括号,左边有一个*,func是一个指针。跳出括号,右边是一个[]运算符,说明func是一个指向数组的指针。看左边,左边有一个*,说明这个数组元素是指针;再跳出括号,右边还是一个括号,说明这个数组的元素是指向函数的指针。总之,func是一个指向数组的指针,这个数组的元素是函数指针,这个指针指向具有int*类型的形参,返回值为int类型的函数

  f:int (*(*func)(int *p))[5]

      func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组元素是具有5个int元素的数组

好了,加油!!

c/c++面试23-29的更多相关文章

  1. 2018-10-23 23:29:54 clanguage

    2018-10-23   23:29:54 clanguage 在 32 位环境以及 Win64 环境下的运行结果为: short=2, int=4, long=4, char=1 在 64 位 Li ...

  2. 剑指offer 面试23题

    面试23题: 题目:如果一个链表中包含环,如何找出环的入口节点? 解题分析:其实此题可以分解为三个题目:1)如何判断一个链表中是否包含环?2)如何找到环的入口节点?3)如何得到环中节点的数目? 解决此 ...

  3. net 程序员面试宝典

    第1部分 求职过程 ------------------------------------------------------------------------------------------ ...

  4. js 面试的坑

    JavaScript事件属性event.target <!DOCTYPE html> <html> <head> <meta charset="UT ...

  5. 编程之法:面试和算法心得(字符串包含java实现)

    内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短.请问,如何最快地判断字符串B中所有字母是否都 ...

  6. 85道Java微服务面试题整理(助力2020面试)

    微服务 面试题 1.您对微服务有何了解? 2.微服务架构有哪些优势? 3.微服务有哪些特点? 4.设计微服务的最佳实践是什么? 5.微服务架构如何运作? 6.微服务架构的优缺点是什么? 7.单片,SO ...

  7. 第23章 排序算法(包括merge等)

      第23章 排序算法  Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...

  8. 我的Python成长之路---第四天---Python基础(15)---2016年1月23日(寒风刺骨)

    二.装饰器     所谓装饰器decorator仅仅是一种语法糖, 可作用的对象可以是函数也可以是类, 装饰器本身是一个函数, 其主要工作方式就是将被装饰的类或者函数当作参数传递给装饰器函数.本质上, ...

  9. iOS面试考察点

    )自我介绍.项目经历.专业知识.自由提问 (2)准备简历.投发简历.笔试(电话面试.).面试.复试.终面试.试用.转正.发展.跳槽(加薪升职) 1闲聊 a)自我介绍:自我认识能力 b)评价上一家公司: ...

  10. 《转载》PAT 习题

    博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...

随机推荐

  1. Django-extra的用法

    ## select提供简单数据 # SELECT age, (age > 18) as is_adult FROM myapp_person; Person.objects.all().extr ...

  2. MyBatis学习(二):与Spring整合(非注解方式配置MyBatis)

    搭建SpringMVC的-->传送门<-- 一.环境搭建: 目录结构: 引用的JAR包: 如果是Maven搭建的话,pom.xml的配置如下: <?xml version=" ...

  3. 网络爬虫(蜘蛛)Scrapy,Python安装!

    Scrapy,Python安装.使用! 1.下载安装Python2.7.6.由于Scrapy还不支持3.x版本号. Latest Python 2 Release - Python 2.7.6,安装时 ...

  4. EasyPlayer实现视频播放局部缩放、广角平移功能(类似水滴直播,快手视频)

    本文转自:http://blog.csdn.net/jyt0551/article/details/56063869 视频播放局部缩放.广角平移功能 在预览图片的时候,利用手势控制图片的缩放.平移,已 ...

  5. zoj 2271 Chance to Encounter a Girl <概率DP>

    题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2271 题意:一个N*N的矩阵( N = 2*k-1 , k< ...

  6. java的多生产者多消费者例子

    import java.util.concurrent.locks.*; public class Test9 { public static void main(String[] args) { / ...

  7. 在MFC中使用大漠插件

    打开Class Wizard,Add Class...->MFC Class From TypeLib... File->Location->>> Finish-> ...

  8. 给js设定一个统一的入口

    javascript是种脚本语言,浏览器下载到哪儿就会运行到哪儿,这样的特性会为编程提供方便,但也easy使程序过于凌乱.支离破碎. js从功能上能够分为两大部分--框架部分和应用部分,框架部分提供的 ...

  9. iOS 9已下的获取APP进程信息

    - (NSDictionary *)getAppInfo:(NSString *)exec withBundleID:(NSString *)bundle { if ([exec isKindOfCl ...

  10. Non-parseable POM C:\Users\admin\.m2\repository\org\springframework问题解决方案

    现象: [INFO] Scanning for projects... [ERROR] [ERROR] Some problems were encountered while processing ...