面试时所遇问题总结

来源:互联网 发布:个人短信群发平台知乎 编辑:程序博客网 时间:2024/06/05 00:20

一、int *p[10] ,int (*p)[10], int (*p)(int) ,int (*p[10])(int) 这四个分别是什么意思?

int *p[10]  定义一个含有10个int类型的指针的数组  (网上说法:10个指向int类型的指针;()的优先级最高,所以p是一个指针,指向一个维度为10的一维数组

int (*p)[10] 定义一个含有10个int类型的数组,并让指针p指向这个数组 (网上说法:指向一个有10个int成员的数组。)

int (*p)(int) 首先是一个返回值为int 类型,并带有一个int类型参数的函数,并让指针p指向这个函数,即p是一个函数指针(网上说法:指向一个形参表为1个int类型,返回值为int 的函数指针)

int (*p[10])(int) 定义一个指针数组,数组中每个成员均是  int (*p)(int) 的指针

举例说明int *p[10]与int (*p)[10]的区别

int a[10]={0,1,2,3,4,5,6,7,8,9}; int(*p)[3]=&a; // 这里赋值一定要用取地址符号。也就是取数组a的地址。

不可以这样赋值: int(*p)[3]=a; // error :类型不兼容。a本来是数组类型,是不可以赋值给int(*)[3]这个类型的。

但是这样是可以的int *p1=a; // ok 因为a可以隐式转换为int*类型,其值实际上就是数组第一个元素的地址,也就是&a[0]

二、函数参数传递方式:值传递与地址传递的区别

以下是个人理解:

1、值传递是将参数值的副本(复制品)传递到函数内部,如果在函数内部,这个参数的副本发生变化,这是不会改变原参数的值,因此,这样的传递方式为单向传递;所做的工作只是针对原件的副本,并未改变原件。

2、地址传递是将参数的地址传递到函数内部,实质上是将原件送入函数内部,如果在函数内部,参数发生变化,其实就是对原件进行直接修改,因此这样的传递方式为双向传递;所做的工作不是针对原件的副本,而是针对原件本身进行修改。

三、C++中指针与引用的区别

指针:指针变量可以表示各种数据结构,能方便的使用数组、字符串和链表,它能像汇编语言一样处理内存地址,从而编写出精炼而高效的程序。也正因为指针是直接与内存打交道,使用稍有不慎,就会造成严重的后果,造成程序崩溃,因此使用指针应特别小心。

1、指针指向的是内存地址,因而可以动态分配内存,而引用只是变量的别名,不占用内存空间,如果对引用进行改变,则引用所对应的变量也相应的改变。

2、指针可以进行多个相似变量的访问,换句话说指针并不是只能指向某块特定的地址,只要需要就可以指向不同的地址,而引用是变量的别名,一旦被初始化为某个变量的引用,则该引用不能成为其他变量的引用,即终身追随该变量。

3、引用必须在声明时进行初始化,而指针可以不初始化;

4、引用是变量的别名,因此引用不能为空,而指针可以为空指针,而且在使用指针的时候常常初始化为空。

5、指针指向的是内存地址,因此可以通过指针间接运算符"*"进行操作取出地址块中的内容,而引用不能进行指针间接运算符"*"操作。

6、指针指向的是内存地址,即指针是用来存放地址的变量,因此,指针在逻辑上是独立的,其指针所指向的内存地址可以被改变,其指向的地址中所存放的数据也可以被改变。但是引用是变量的别名,逻辑上不独立,它的存在具有依附性。

7、进行函数参数传递时,两者不同。虽然指针和引用均可以进行函数参数传递,但是指针传递参数与引用传递参数有着本质的区别,1)指针传递参数是通过传递实参的地址,本质上属于值传递,值传递过程中,被调函数的形式参数作为局部变量进行处理,在栈中开辟空间用来保存实参的值,从而形成实参的副本,值传递的特点:被调函数中对形参的任何操作都不会影响主调函数实参的值。(这句话个人理解:如果是通过指针进行参数传递,则指针传递的是原实参地址的副本,对于实参地址本身不会影响;而处理时是对指针进行解引用"*"操作,其实就是对实参地址中的内容进行直接操作,这与传值并不矛盾,如果传递进来的是普通变量,则在被调函数中,形参就是实参的副本,而进行操作的就是形参本身,因此,好好理解这几句话便不难想象,普通变量的传递方式是单向传递,而指针却是双向传递;

2)引用传递时,被调函数中的形参虽然也是作为局部变量在栈中开辟内存,但是此时存放的是由主调函数放进来的实参变量的地址,而不是实参变量地址的副本,因此,此时对形参进行操作其实就是通过栈中的地址访问主调函数中的实参,虽然共同点都是被调函数栈空间中的局部变量,但是任何对引用参数的处理都会通过间接寻址的方式操作主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针的地址(因为这个地址是被调函数中栈空间开辟的地址),将不会影响到实参,如果想要改变实参,可以使用指向指针的指针或者指针引用。

8、指针和引用的自增(++)运算意义不一样;

9、对引用进行sizeof操作得到的是引用对应变量(对象)的大小,而对指针进行sizeof操作得到的是指针本身的大小








1 0
原创粉丝点击