面试题4:数组、指针、引用的联系区别

数组和指针???

从两个方面来看,一是作为一个语言,数组是必须要支持的一种数组类型,原因很简单,数组是线性表的直接体现。而从编译器设计者的角度来看,如果为数组专门设计一套实现标准会非常繁杂(事实上,后来C++完成了这一任务,它就是标准库中的vector容器)。这一对矛盾最后以双方的相互妥协得以解决,而解决方法就是利用现有的指针来间接实现数组

编译器为了简化对数组的支持,实际上是利用指针实现了对数组的支持。具体来说,就是将表达式中的数组元素引用转化为指针加偏移量的引用。这么说大家可能不理解,首先什么是引用呢?引用其实就是使用,从编译器的角度来看,就是从一个符号找到对应内存并进行读写的过程。

要区分两个相关的概念,一定要将二者的作用区分清楚,即为什么要有这个东西。就比如sizeof与strlen的区分,只要明白了二者各自的作用,就会发现二者其实根本没有一点儿关系,完全是为了实现不同功能而设置的。数组和指针也是一样,指针是一类特殊的变量,主要用途是函数间的传址,用这种方式来改变实参内容。而数组是用来实现线性表的结构,用于把同类对象集中在一起放置。所以,如果下次有人问你数组和指针的区别,你首先第一句要说的就是二者根本没有联系,这么说并这么理解,对于弄清这两个家伙的关系是很有裨益的。

C语言中指针与数组的区别与联系

___________________________________________________________________________________________

举例:

1.数组的分配与释放

数组在内存中是连续存放的,开辟一块连续的内存空间;数组所占存储空间:sizeof(数组名),数组大小:sizeof(数组名)/sizeof(数据类型)。初始化字符数组时要注意字符串结尾处有结尾符‘\0’。 

char a[]={"Hello"};//按字符串初始化,大小为6.
char b[]={'H','e','l','l','o'};//按字符初始化(错误,输出时将会乱码,没有结束符)

char c[]={'H','e','l','l','o','\0'};//按字符初始化

2.指针的分配与释放:

指针是一种类型,包含其他变量的地址,也有的叫它“地址变量”。指针的类型是说明指针所指向的地址空间的类型。

申请、释放堆中的指针,使用new 和 delete,动态分配失败,返回一个空指针(NULL)

指向对象的指针:int *p=new int(0) ;    delete p;(()里面的值是初始化值)

指向数组的指针:int *p=new int[n];    delete[] p;(n表示数组的大小,值不必再编译时确定,可以在运行时确定)

指向类的指针:Class *p=new Class;  delete p;(若构造函数有参数,则new Class后面有参数,否则调用默认构造函数,delete调用析构函数)

指针数组:一个数组里面存放的同类型的指针,如 int *a[10];需要对数组每个元素初始化如:a[0]=new int [n];a[1]=new int [m];释放也要单独释放:delete a[0];delete a[1]

数组指针:指向数组的指针。1维:int *p=new int[10];delete []p; 2维:int (*p)[10]=new int[10][10];delete[] p; 3维:int(*p)[9][9]=new int [1][9][9];delete []p;

指针的指针:int **pp=new (int*)[2]; pp[0]=new int[3];pp[1]=new int[4];delete[] pp[0];delete[]pp[1]

数组与指针的区别

——————————————————————————————————————————————

一、引用的定义

引用是给另外一个变量起别名,所以引用不会分配内存空间。

引用的声明方法:类型标识符 &引用名=目标变量名;(如int &ptr = num;)

二、引用与指针的区别

1、指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。

2、引用在定义的时候必须进行初始化,并且不能够改变。指针在定义的时候不一定要初始化,并且指向的空间可变。(注:不能有引用的值不能为NULL)

3、有多级指针,但是没有多级引用,只能有一级引用。

4、指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用时引用的变量值加1)

5、sizeof 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小。

6、引用访问一个变量是直接访问,而指针访问一个变量是间接访问。

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

补充:

队列、堆栈与数组、链表的关系与区分

猜你喜欢

转载自blog.csdn.net/wangdd_199326/article/details/81323810