IE盒子

搜索
查看: 93|回复: 0

C++面试:指针和引用的区别

[复制链接]

4

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-3-26 18:58:05 | 显示全部楼层 |阅读模式
11、指针和引用的区别

指针和引⽤都是⼀种内存地址的概念,区别呢,指针是⼀个实体,引⽤只是⼀个别名。 在程序编译的时候,将指针和引⽤添加到符号表中。
(1)指针它指向⼀块内存,指针的内容是所指向的内存的地址,在编译的时候,则是将“指针变量名-指针变量的地址”添加到符号表中,所以说,指针包含的内容是可以改变的,允许拷贝和赋值,有 const 和⾮ const 区别,甚⾄可以为空, sizeof 指针得到的是指针类型的⼤⼩。
(2)⽽对于引⽤来说,它只是⼀块内存的别名,在添加到符号表的时候,是将"引用变量名-引⽤对象的地址"添加到符号表中,符号表⼀经完成不能改变,所以引⽤必须⽽且只能在定义时被绑定到⼀块内存上,后续不能更改,也不能为空,也没有 const 和⾮ const 区别。
sizeof 引⽤得到代表对象的⼤⼩。⽽ sizeof 指针得到的是指针本身的⼤⼩。另外在参数传递中,指针需要被解引⽤(*)后才可以对对象进⾏操作,⽽直接对引⽤进⾏的修改会直接作⽤到引⽤ 对象上。
作为参数时也不同,传指针的实质是传值,传递的值是指针的地址;传引⽤的实质是传地址, 传递的是变量的地址。
12、 野(wild)指针与悬空(dangling)指针有什么区别?如何避免?

野指针(wild pointer):就是没有被初始化过的指针。⽤ gcc -Wall 编译, 会出现 used uninitialized 警告。
悬空指针:是指针最初指向的内存已经被释放了的⼀种指针。
无论野指针还是悬空指针,都是指向⽆效内存区域(这⾥的⽆效指的是"不安全不可控")的指针。 访问"不安全可控"(invalid)的内存区域将导致"Undefined Behavior" 。
如何避免使用野指针? 在平时的编码中,养成在定义指针后且在使⽤之前完成初始化的习惯或者使⽤智能指针。
如何避免悬空指针?在编码时候,当我们对对象内存释放的时候,一定要把它置为nullptr
13、说⼀下 const 修饰指针如何区分?

下⾯都是合法的声明,但是含义⼤不同:
const int * p1; //指向整形常量的指针,它指向的值不能修改
int * const p2; //指向整形的常量指针 ,它不能再指向别的变量,但指向(变量)的值可以修改。
const int *const p3;//指向整形常量的常量指针 。它既不能再指向别的常量,指向的值也不能修改。
理解这些声明的技巧在于,查看关键字const右边来确定什么被声明为常量 ,如果该关键字的右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量。
14、简单说⼀下函数指针

从定义和⽤途两⽅⾯来说⼀下⾃⼰的理解:
首先是定义:函数指针是指向函数的指针变量。函数指针本身首先是一个指针变量,该指针变量指向一个具体的函数。这正如指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
在编译时,每⼀个函数都有⼀个⼊⼝地址,该⼊⼝地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样, 在这些概念上是⼤体⼀致的。
其次是⽤途:调⽤函数和做函数的参数,⽐如回调函数。
示例:
char * fun(char * p) {…} // 函数fun 表示的是返回值是char*

char * (*pf)(char * p); // 函数指针 表示的是返回值是char* 参数表是char*的函数指针

pf pf = fun; // 函数指针pf指向函数fun

pf(p); // 通过函数指针pf调⽤函数**fun** 我们也可以直接使用*pf(p)表示对指针取值
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表