c/c++面试30-38之指针
30 看代码写结果-----指针加减
#include <stdio.h> int main(void)
{ int a[] = { , , , , };
int *ptr = (int*)(&a + );//这里要特别注意,&a+1的值 &a+5*sizeof(int)也就是a[5]的地址 但是越界了 强制转换了int* printf("%d\n", *(a + ));//
printf("%d\n", *(ptr - ));//
getchar();
return ;
}
31 指针的比较
#include <iostream>
using namespace std;
int main(void)
{
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
char* str7 = "abc";
char* str8 = "abc"; //栈上分配 但是位置不同 所以为0
cout << (str1 == str2) << endl;//0
cout << (str3 == str4) << endl;//0
//栈中分配 存放在数据区 所以是指向同一块数据区的内存 1
cout << (str5 == str6) << endl;//
cout << (str7 == str8) << endl;// getchar();
return ;
}
32 指针常量和常量指针的区别
(1)规则
前面的一个通常式修饰部分,中心词式后面一个词
常量指针:常量的指针,首先是一个指针
指针指向的地址的内容式不可以修改的
指针常量:指针的常量,它首先是一个常量,然后才是指针
不能修改这个指针所指向的地址,只能指向那个位置,就好像一个数组的数组名一样,固定的指针(不能使用p++),但是指向的内容是可以改变的
(2)代码
#include <stdio.h> int main10()
{
//两者都不可以对指向的内存进行修改 node1会出现编译错误 node2会出现运行错误
const char* node1 = "abc";//常量指针
char *const node2 = "abc";//指针常量 /*node1[2] = 'k';
*node1[2] = 'k';
*node1 = "xyz";出现编译错误*/
node1 = "xyz"; node2[] = 'k';
/* *node2[2] = 'k';
*node2 = "xyz";运行错误*/
node2 = "xyz"; getchar();
return ;
}
33 指针数组和数组指针的区别
(1)指针数组是:一个数组存放的都是同一个类型的指针
int *a[10]
(2)数组指针
int *b = new int[10];
b指向含有10个整形数据的一维数组 释放一定要delete[]
(3)代码
#include<iostream>
using namespace std;
int main11()
{
int x1[] = { , , , };
int x2[] = { , };
int x3[] = { , , }; int *a[];//指针数组a 两个指针指向数组x2 x3
int *b = x1;//数组指针b 指向数组x1
int i = ; a[] = x2;
a[] = x3; cout << "输出a[0]" << endl;
for (int i = ; i < sizeof(x2) / sizeof(int); i++)
{
cout << a[][i] << " ";
}
cout << endl;//5 6 cout << "输出a[1]";
for (int i = ; i < sizeof(x2) / sizeof(int); i++)
{
cout << a[][i] << " ";//7 8 9
}
cout << endl; cout << "b";
for (int i = ; i < sizeof(x2) / sizeof(int); i++)
{
cout << b[i]<< " ";//1 2 3
}
cout << endl; getchar();
return ;
}
34 函数指针与指针函数的区别
(1)每一个函数,本省都有一个入口地址,这个地址相当于一个指针。
(2)函数指针是指向函数的指针变量,所以本身就是一个指针变量,只不过指针变量指向函数。这样一来,有了指向函数的指针变量以后,我们就可以通过这个指针来调用函数。指针函数是返回指针类型的函数
(3)代码
#include <iostream> using namespace std; int max(int x, int y)
{
return (x > y ? x : y);
} float *find(float *p, int x)
{
return p + x;
} int main()
{
float score[] = { , , , };
int(*p)(int, int);
float *q = find(score + , );
int a; p = max;
a = (*p)(, ); cout << "a=" << a << endl;//
cout << "*q=" << *q << endl;//
getchar();
return ;
}
35 数组指针和函数指针的定义
(1) 含有10个元素的指针数组 int *a[10]
(2) 数组指针 int *a = new int[10]
(3) 函数指针 void (*fn)(int,int)
(4) int (*fnArray[10])(int,int)
36 各种指针的定义
(1)void (*f)(int,int) f是指向void max(int x,int y)类型的函数指针
(2)int *fn() fn是返回int指针类型的函数
(3)const int *p p是一个指向const的指针,指向一个常量
(4)int* const q;q是一个const指针
(5)const int* const ptr ptr是一个指向const的const指针
37 typedef用于函数指针的定义
(1) typedef int (*pfun)(int x,int y)
(2)解析:
pfun是一个使用typedef自定义的数据类型。它表示一个函数指针,其参数有两个,都是int类型,返回值也是int类型。
(3) 使用方法
typedef int (*pfun)(int x,int y)//表示pfun是一个函数指针类型
int fun(int x,int y) //定义一个返回值为int的函数
pfun p = fun//函数指针p赋给fun的地址
int ret = p(2,3);//调用
38 什么是野指针
(1)野指针不是NULL指针,是指向“垃圾”内存的指针
(2)产生的原因
a:指针变量没有初始化。默认是乱指的
b:指针被free或者delete之后没有置为NULL
c/c++面试30-38之指针的更多相关文章
- 剑指offer 面试30题
		
面试30题: 题目:包含min函数的栈 题:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.在该栈中,调用min.push.pop的时间复杂度都是O(1) 解题思路:1)如果每次 ...
 - C++解析(30):关于指针判别、构造异常和模板二义性的疑问
		
0.目录 1.指针的判别 2.构造中的异常 2.1 如果构造函数中抛出异常会发生什么? 2.2 如果析构函数中抛出异常会发生什么? 3.令人迷惑的写法 3.1 模板中的二义性 3.2 函数异常声明 4 ...
 - C++ 面试 (1) 指针
		
指针是C++中一类颇具特色的数据类型,允许直接操作内存地址,实现内存的动态分配.指针问题通常包括指针常量,常量指针,数组指针,指针数组,函数指针,指针传值等. 指针和引用的区别 非空区别.在任何情况下 ...
 - JAVA程序员面试30问(附带答案)
		
第一,谈谈final, finally, finalize的区别. 最常被问到.final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能 ...
 - 一位资深php程序员在北京的面试30个题目
		
1.SESSION 保存在服务器的哪里?2.服务端是如何获取客户端的cookie?3.如何实现SESSION共享,共享的原理是什么?4.请大致说出LVS搭建的过程,文件共享原理是什么?5.网络共享服务 ...
 - 面试系列38 分库分表之后,id主键如何处理?
		
(1)数据库自增id 这个就是说你的系统里每次得到一个id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个id.拿到这个id之后再往对应的分库分表里去写入. 这个方案 ...
 - HDU6026 Deleting Edges                                                                                            2017-05-07 19:30             38人阅读              评论(0)              收藏
		
Deleting Edges Time ...
 - Google 历年笔试面试30题
		
1.正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项,例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12(1).设计一个函数void g ...
 - Spark面试相关
		
Spark Core面试篇01 随着Spark技术在企业中应用越来越广泛,Spark成为大数据开发必须掌握的技能.前期分享了很多关于Spark的学习视频和文章,为了进一步巩固和掌握Spark,在原有s ...
 - net 程序员面试宝典
		
第1部分 求职过程 ------------------------------------------------------------------------------------------ ...
 
随机推荐
- 【Sprint2 每日Scrum】 第一天(4.22)Sprint2计划会议成果
			
Sprint2计划会议成果 从今天起我们就开始正式的Sprint2之旅了,经过上一次Sprint1的冲刺计划和几天的调整,我们已经大致了解了敏捷开发的流程和思想,并将我们的TD学生助手做出了大致的框架 ...
 - 【每日Scrum】第二天(4.12)  TD学生助手Sprint1站立会议
			
TD学生助手Sprint1站立会议(4.12) 任务看板 站立会议内容 组员 昨天 今天 困难 签到 刘铸辉 (组长) 做了几个Sqlite编辑事件导入数据库没成功,就编辑图片滑动显示功能 今天学习了 ...
 - MySQL-获取某天的数据
			
今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 近7天 DAY) <= date(时间字段名) 近30天 DAY) & ...
 - PS 魔法棒
			
魔术棒工具是通过选取图像中颜色相近或大面积单色区域的像素来制作选区,魔术棒用于纯色背景中较多. 容差数值越大,选择出的选区就越大,容差越小,对颜色差别的要求也就越严格,选择出的选区也就越小 按住shi ...
 - vim tips 集锦
			
删除文件中的空行 :g/^$/d g 表示 global,全文件 ^ 是行开始,$ 是行结束 d 表示删除该 这里只能匹配到没有白空符的空行,假如要删除有空白符的空行,则使用: :g/^\s*$/d ...
 - 计算机鼻祖-Donald Knuth(高纳德) 的传奇
			
李开复说,练内功,不要仅仅花功夫学习各种流行的编程语言和工具,以及一些公司招聘广告上要求的科目.要把数据结构.算法.数据库.操作系统原理.计算机体系结构.计算机网络,离散数学等基础课程学好.最好还是试 ...
 - 【BZOJ3728】PA2014Final Zarowki 贪心
			
[BZOJ3728]PA2014Final Zarowki Description 有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照 ...
 - DuiLib笔记之自定义标题栏以及响应按钮点击事件
			
在博文DuiLib笔记,基于WindowImplBase的基础模板的基础上,修改皮肤文件如下 <?xml version="1.0" encoding="utf-8 ...
 - (转)SDP协议概述
			
1 简介 SDP 完全是一种会话描述格式, 它不属于传输协议. 它使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP). 实时流协议(RTSP).MIME 扩展协议的电子邮件以 ...
 - linux4 分区
			
分区 对硬盘分区:安装操作系统的时候有一个分区过程,新增加硬盘也会涉及到分区,如何给操作系统新增一台硬件设备. 启动操作系统. Home是当前账号的根目录,Computer是/系统根目录. ~是当前账 ...