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. HDMI各版本对比

    转:一文看懂从HDMI1.0到HDMI2.1的历代规格变化 hdmi HDMI详解 https://blog.csdn.net/xubin341719/article/details/7713450 ...

  2. XML(四)dom4j解析XML

    使用dom4j须要导入jar包 jar包下载地址:http://pan.baidu.com/s/1o65jWRw 将dom4j-1.6.1.jar包导入Eclipse book2.xml <?x ...

  3. 热烈庆祝UE4完全免费Free---GitHub的关联方式

    热烈庆祝UE4完全免费Free---GitHub的关联方式 时间:2015-03-03 18:38:52      阅读:3007      评论:0      收藏:0      [点我收藏+] 标 ...

  4. oracle sqlplus 常用操作

    命令 含义 / 运行 SQL 缓冲区 ? [关键词] 对关键词提供 SQL 帮助 @[@] [文件名] [参数列表] 通过指定的参数,运行指定的命令文件 ACC[EPT] 变量 [DEF[AULT] ...

  5. React Examples

    是时候拿React练练手了~ https://reactjs.org/community/examples.html https://daveceddia.com/react-practice-pro ...

  6. linux cat命令(转载)

    来源:http://blog.sina.com.cn/s/blog_52f6ead0010127xm.html 1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具. 查看一 ...

  7. Android-可随意拖动的View

    http://blog.csdn.net/w8320273/article/details/8101687

  8. MonoTouch.Dialog简介

    新建一个Single View Application项目 添加程序集 MonoTouch.Dialog.dll引用 删除 MainStoryboard.storyboard 添加空类Task.cs ...

  9. Javascript MVC 学习笔记(二) 控制器和状态

    今天进入第二个部分:控制器. 控制器和状态 从以往的开发经验来看.我们都是将状态保存在server的session或者本地cookie中,但Javascript应用往往被限制在单页面,所以我们也能够将 ...

  10. UVA 12130 - Summits(BFS+贪心)

    UVA 12130 - Summits 题目链接 题意:给定一个h * w的图,每一个位置有一个值.如今要求出这个图上的峰顶有多少个.峰顶是这样定义的.有一个d值,假设一个位置是峰顶.那么它不能走到不 ...