11程序员面试笔记之指针和引用

参考资料:

[1]程序员面试笔记 第11章 指针和引用

学习建议:

必须先思考!!!

11.1指针及其应用

面试题1:被调函数中修改主调函数中的变量
#include<iostream>
#include<vector>
using namespace std;

void swap(int* a,int* b)
{
    int tmp = *a;
    *a = *b;
    *b  =tmp;
}

void sort(int* a,int* b,int* c)
{
    //1.确保a最大
    if(*a<*b)
        swap(a,b);
    if(*a<*c)
        swap(a,c);
    //2.确保b最大
    if(*b<*c)
        swap(b,c);
}

int main()
{
    int a=80,b=90,c=20;

    sort(&a,&b,&c);

    cout<<"a:"<<a<<",b="<<b<<",c="<<c<<endl;
}
面试题2:区分指针和数组

(1)数组名等价于数组首元素的地址
(2)字符数组

char str1[15] = "hello world";
char str2[] = "hello world";

注意:没有显示指明大小的数组,必须在定义的时候初始化。
(3)字符指针

char * str3  ="hello world";

11.2指针常量与常量指针

面试题1:指针常量与常量指针的常见错误

注意:
(1)要明确地址不能修改还是内容不能修改。
(2)可以通过修改地址间接修改指针指向的值!!!https://www.jianshu.com/p/c9717911d040
(3)常量必须在定义的时候初始化!!!
(4)常量地址只能赋值给常量指针!!!

面试题2:指针常量用做函数参数

无特殊的

面试题3:指针常量与字符串常量的冲突

指针str1指向字符串常量,常量的值不能修改

#include<iostream>
using namespace std;

int main()
{
    //指针str1指向字符串常量,常量的值不能修改
    //char * const str1 ="apple";
    char *str1 = "apple";

    str1 = "orange";
    cout<<str1<<endl;
}

11.3指针数组与数组指针

指针数组:存放指针的数组

int* a[10];

数组指针:指向数组的指针

int(*a)[10];//把()遮起来,指针a指向的是int [10]的数组
面试题1:简述指针数组与数组指针的区别

注意:
int类型的变量是4个字节
地址是的单位是字节
&a和&a[0]的数值是一样的,对&a解引用后是&a[0],对&a[0]解引用后是a[0]。

面试题1:简述数组地址与数组首元素地址的区别

数组地址&a和数组首元素地址&a[0]
要获得数组地址,要用数组指针

int main()
{
    int a[6]={1,2,3,4,5,6};
    int(*p)[6]=&a;//要获得数组地址,要用数组指针
    //int* p = &a[0];
    cout<<p<<endl;

}
面试题3:简述指针数组与指向指针的指针区别
先不做。

11.4指向指针的指针

先不做。

11.5函数指针

函数名是函数的入口地址
函数指针使用如下:

int max(int a,int b){return a>b?a:b}
int(*p)(int,int)= max;//如果去掉括号int* p(int,int) 就是函数了
int x=10,y=20;
int z=p(x,y);
面试题1:通过函数指针实现4则运算

动手去写。

面试题2:简化超长的函数指针类型
//将类型int(*)(int,int,int)命名为Pfunc,这样在程序中直接使用Pfunc来代替int(*)(int,int,int)
typedef int(* Pfunc)(int,int,int);
int process(int a,int b,int c,Pfunc func);

11.6this指针

在对象调用类非静态成员函数时,会隐式地将对象的地址作为第一个参数传递给this指针
看到如下就明白了。

stu.setAge(20);   =>  setAge(&stu,20);
setAge(int age);  =>  setAge(Student* this,int age);
面试题1:this指针的常识性问题

在对象调用类非静态成员函数时,会隐式地将对象的地址作为第一个参数传递给this指针

面试题2:链式访问对象成员

链式访问:

int main()
{
    Book* book = new Book();
    book->setName("C++")->setPrice(11)->setLanguage('E');//链式访问
}
Book* setName(string name)
{
        this->name= name;//为了避免名字冲突,访问数据成员时应该使用this指针
        return this;//为了支持链式访问,返回对象的地址
}
面试题3:通过空指针调用类的成员函数

成员函数中,若this指针为空指针,利用此this指针访问成员变量会产生运行时错误。

11.7空指针与野指针

空指针:没有指向的指针

int* p=NULL;

野指针(只能避免而无法判断)
指向垃圾的指针
1.指针必须进行初始化

int *p=NULL;
int *p = &a;
int *p = (int *)malloc(sizeof(int));

2.指针指向的变量被free或delete后没有置为NULL

int *p = (int *)malloc(sizeof(int));
free(p);
p=NULL;
面试题1:常见的野指针

1.把*p看成整体就行。指针定义必须进行初始化。
2.指针调用free函数之后得显式地将指针置为NULL。
3.应该使用堆空间进行动态分配内存。使用栈空间,函数调用结束之后栈空间释放。

面试题2:在构造函数中释放对象本身(有点问题)

delete this后,这时指针就变为一个野指针。
delete和free只能释放堆内存。

11.8引用(!!!)

引用就是变量的别名
引用必须在定义时进行初始化

面试题1:指针与引用的区别

1.指针是变量的地址,引用是变量的别名
2.指针可以不初始化,此时指针的值是一个垃圾地址
引用必须进行初始化
3.指针使用期间可以被修改,引用使用期间不能被修改。
4.指针可以设为NULL,引用不能设为NULL。
5.指针可以定义二重指针,引用不能定义二重引用。
因为引用是变量的别名,二重引用没有意义。
6.指针需要先解引用,引用直接使用。

面试题2:指针与引用的使用

注意:
不能成为别名,但是可以赋值啊

#include<iostream>
using namespace std;

int main()
{
    int a =10,b=20;
    int &r = a;//r是a的别名
    int *p= &a;
    int* &rp = p;//rp是p的别名

    if((int)&r == (int)&a)
        cout<<"(int)&r == (int)&a"<<endl;
    else
        cout<<"(int)&r != (int)&a"<<endl;

    cout<<(int)&r<<endl;//强制将地址转换为int类型

    if((int)&p ==(int)&a)//1个是p的地址,1个是a的地址
        cout<<"(int)&p ==(int)&a"<<endl;
    else
        cout<<"(int)&p !=(int)&a"<<endl;

    r=b;//不能成为别名,但是可以赋值啊
    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;

    (*p)++;//a=21
    (*rp)++;//a=22

    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;
}
面试题3:使用常量初始化引用
#include<iostream>
using namespace std;
void printAge(const int& age)
{
    cout<<"The age of the dog is"<<age<<endl;
}

int main()
{
    const int &a= 10;//常量引用得加const
    int b= 10;

    printAge(a);//常量引用得加const
    printAge(b);//常量引用得加const
    printAge(10);//常量引用得加const
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • 开尽芳华信自坚, 一朝容减倩谁怜? 金蜂薄幸寻新爱, 粉蝶无情别旧欢。 花片落,叶茎残, 傲姿风骨却依然。 凋零不...
    文泉野老阅读 519评论 0 0
  • 在与很多客户交流的时候,客户反映最多地就是我没时间,我没时间~~,其实,我们每一个人都有权利说'我很忙'这三个字,...
    洪兴Yoga阅读 163评论 0 0
  • 当用户在使用app出现崩溃现象时,我们需要知道是什么原因,并将原因记录下来上到服务器,这样以后我们就可以知道具体是...
    已经是咸鱼的小涛orz阅读 987评论 0 0
  • 文/熠歆 连续监考了七场考试,我发现场场都打瞌睡、睡觉的三位同学分别是谢正奎(小胖)、陶文富(小好)、阚 云凯(小...
    熠歆阅读 346评论 6 6