c/c++面试23-29
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的更多相关文章
- 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 ...
- 剑指offer 面试23题
面试23题: 题目:如果一个链表中包含环,如何找出环的入口节点? 解题分析:其实此题可以分解为三个题目:1)如何判断一个链表中是否包含环?2)如何找到环的入口节点?3)如何得到环中节点的数目? 解决此 ...
- net 程序员面试宝典
第1部分 求职过程 ------------------------------------------------------------------------------------------ ...
- js 面试的坑
JavaScript事件属性event.target <!DOCTYPE html> <html> <head> <meta charset="UT ...
- 编程之法:面试和算法心得(字符串包含java实现)
内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短.请问,如何最快地判断字符串B中所有字母是否都 ...
- 85道Java微服务面试题整理(助力2020面试)
微服务 面试题 1.您对微服务有何了解? 2.微服务架构有哪些优势? 3.微服务有哪些特点? 4.设计微服务的最佳实践是什么? 5.微服务架构如何运作? 6.微服务架构的优缺点是什么? 7.单片,SO ...
- 第23章 排序算法(包括merge等)
第23章 排序算法 Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...
- 我的Python成长之路---第四天---Python基础(15)---2016年1月23日(寒风刺骨)
二.装饰器 所谓装饰器decorator仅仅是一种语法糖, 可作用的对象可以是函数也可以是类, 装饰器本身是一个函数, 其主要工作方式就是将被装饰的类或者函数当作参数传递给装饰器函数.本质上, ...
- iOS面试考察点
)自我介绍.项目经历.专业知识.自由提问 (2)准备简历.投发简历.笔试(电话面试.).面试.复试.终面试.试用.转正.发展.跳槽(加薪升职) 1闲聊 a)自我介绍:自我认识能力 b)评价上一家公司: ...
- 《转载》PAT 习题
博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...
随机推荐
- error MSB8011: 未能注冊输出。请尝试启用“逐用户重定向”
初试MFC就遇到困难了.vs2010创建一个MFC ActiveX控件项目. 什么都还没做呢,就出现故障了? 郁闷呀.! ! 1>C:\Program Files\MSBuild\Microso ...
- Centos 安装Puppet
环境说明: OS:CentOS 5.4 i386puppetmaster 192.168.0.12 hostname: puppetmaster.info.comclient ...
- Attempting to write a row[5] in the range [0,394] that is already written to disk.
我用POI操作excel写数据,然后就报这个错了 XSSFWorkbook workbook = new XSSFWorkbook(); SXSSFWorkbook sxssfWorkbook = n ...
- mac gem命令
$ gem sources -r https://rubygems.org/ (移除旧版本的镜像,如果你不知道你电脑上目前用的是什么镜像,可用 $ gem sources -l 来查看) $ g ...
- Kotlin基本语法笔记之函数、变量的定义及null检测
定义函数 fun sum(a: Int, b: Int): Int { return a + b } 该函数中两个参数的类型都是Int,返回类型是Int 也可以做如下简化 fun sum(a: Int ...
- mongodb学习之:数据库
首先来介绍下Mongodb的基本概念: 左边一列是关系数据库的术语,右边这一列是NOSQL也就是mongodb的术语 database: database 数据库 tabl ...
- 解决express video 手机无法播放的问题
http://stackoverflow.com/questions/24976123/streaming-a-video-file-to-an-html5-video-player-with-nod ...
- -webkit-mask-box-image给框架加个同样大小的遮罩
很棒的css属性,可以在div上方建个同大小的遮罩,配合线性变化gradient可以实现很酷的样式,比如:时间选择的UI组件,里面有个模糊的上方遮罩 手册地址:https://developer.mo ...
- UVA10518 How Many Calls? —— 矩阵快速幂
题目链接:https://vjudge.net/problem/UVA-10518 题解: 问:求斐波那契数f[n]的时候调用了多少次f[n] = f[n-1] + f[n-2],没有记忆化,一直递归 ...
- Linux 查看服务状态(服务与进程)
原文地址:http://blog.csdn.net/weixin_37979944/article/details/79029188 指令(instruction): 计算机实际上可以做的事情实质上非 ...