问题一:数组与指针的区别
概念不同: 数组是存储多个相同类型数据的集合;而指针相当于一个变量,存放的是数据在内存中的地址。
赋值不同: 数组的赋值只能一个个元素的赋值或者拷贝;同类型指针变量可以相互赋值
访问数据方式不同: 数组可以直接访问,指针需要先解引用,然后访问指向地址的内容
sizeof不同: 数组的size与元素类型还有个数有关,而指针变量的大小与32 64位操作系统有关。
指针与数组名异同: 指针与数组名都可以表示地址,但是指针是变量可以修改,数组名是常量不可以修改赋值。
当数组传参的时候,数组会退化为指针。 这是因为c语言只能以值拷贝的方式传递参数,如果拷贝整个数组,效率太低,因此c语言将数组的传参进行退化,将数组名看做是常量指针,指向数组首元素
问题二:指针数组与数组指针
指针数组本质上是数组,数组指针本质上是指针,优先级高的决定本质。
指针数组:实际是数组,数组内的每个元素存在指针类型的元素 int * arr[8];
**优先级 [] > **
数组指针:实际上是一个指针,指向一个数组 int(*a)[8];
优先级 (*) > [],说明a是指针把变量,指向一个存储8个整形元素的数组。
问题三:引用与指针的区别
- **引用是给已定义的变量其别名,声明的时候必须初始化。**可以看做是一个指针常量,只能绑定到初始化它的对象。(指向常量的指针指不能通过指针改变指针所指对象)。指针是一个存储地址的变量,在运行时可以改变所指内容。
- **引用创建的时候必须初始化,且不为空,指针创建时可以为空。**不存在指向空值的引用,意味着引用的代码效率比使用指针要高,因为引用需要测试其合法性
- sizeof意义不同
- 没有引用常量,有指针常量。 没有int & const p, 有 int * const p。存在常量指针与常量引用: const int * p, const int &p.
- 多级指针 一级引用 指针可以多级(**p)
- 参数传递 作为参数传递时,对引用的修改直接作用于引用指向的对象,但是指针必须先解引用,然后才能修改指向的对象。