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 ...
随机推荐
- HDU1009_FatMouse' Trade【贪心】【水题】
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- AndroidManifest具体解释之Application(有图更好懂)
可以包括的标签: <activity> <activity-alias> <service> <receiver> <provider> & ...
- IP分配及网段划分
1.IP我们先来了解一下3类常用的IP A类IP段 0.0.0.0 到127.255.255.255 B类IP段 128.0.0.0 到191.255.255.255 C类IP段 192.0.0. ...
- linux 查找最后几条数据
tail(选项)(参数) -n<N>或——line=<N>:输出文件的尾部N(N位数字)行内容. 例如:grep 查询 2018-02-*/*.log |tail -n 5查询 ...
- 【caffe-windows】 caffe-master 之图片转换成lmdb or leveldb
前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签 ...
- 图像处理之滤波---gabor
http://blog.csdn.net/xiaowei_cqu/article/details/24745945 小魏北大
- SVN经常使用命令总结(持续更新)
如今流行的协同管理工具预计就属SVN和Git了.这两者都使用过,只是如今正在使用的是SVN.故将常常使用的命令总结下来. 无论是Windows端的svnclient还是eclipse的subversi ...
- 哈希表的java实现
一.为什么要用哈希表 树的操作通常需要O(N)的时间级,而哈希表中无论存有多少数据,它的插入和查找(有时包括删除)只需要接近常量级的时间,即O(1)的时间级. 但是哈希表也有一定的缺点:它是基于数组的 ...
- vmware安装操作系统
安装的时候,直接选择“从光盘或者映像安装”就可以了,很方便的.不需要再去从u盘什么的安装了.
- flume采集微信小程序数据
flume采集微信小程序数据 flume收集前端埋点数据[1]POST请求http://f.x.com:50000数据格式: JsonArray数据格式示例:[{ "headers" ...