数组和指针
数组
概念理解
所谓数组,是有序的元素序列。
若将有限个类型相同的变量的集合命名,那么这个名称为数组名。
组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
用于区分数组的各个元素的数字编号称为下标。
数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按无序的形式组织起来的一种形式。
这些无序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。
数组说明的一般形式为:类型说明符 数组名 [常量表达式]
分类
按元素:数值数组、字符数组、指针数组、结构数组
按类型:一维数组、二维数组、多维数组
特点
数组的元素的数据类型是相同的。
数组元素的储存是有先后顺序的,在内存中是连续储蓄的。
数组元素通过数组名加下标来进行访问的。例如:a[0]表示数组a的第一个元素。
在方法中定义的基本类型的变量和对象都是在方法中栈内存里分配的,例如:char a[] = "123";变量a和字符数组"123"都在栈上存放。
动态开辟的数组(malloc/new)的对象和数组在堆内存中分配。
指针(Pointer)
概念理解
指针是编程语言中的一个对象,它的值直接指向存在电脑存储器中另一个地方的值。也可以把它就理解为地址。
指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。32位系统下寻址能力(地址空间)是4G Bytes(0~232-1)二进制表示长度为32bits(也就是4Bytes), unsigned int类型也正好如此取值。
C++标准规定,指针分为两类:
object pointer type:指向void或对象类型,表示对象在内存中的字节地址或空指针。
function pointer type:指代一个函数。
指针与数组的关系
指针数组:各个元素都是指针。
本质上是数组,存放的是指针;
可以类似看作成二维数组;
初始化可以用一个二维数组来初始化;
//法一: int a[2][2] = {{1,2},{3,4}}; int *b[2]; for(int i = 0; i < 2; ++i) { //二维数组每一行相当于一个一维数组,把每个一维数组名赋给指针数组的每个元素。 b[i] = a[i]; }
不能把二维数组名直接赋值给指针数组,因为类型不一样,例如:
int a[2][2] = {{1,2},{3,4}}; int *b[2]; b = a; //错误操作,因为二维数组a指向的是int [][]类型的指针,b是指向int* []类型的指针。
数组指针:指向数组的指针,是一个常数。
- 本质上是一个指针;
例如:int (*a)[2]
表示一个指向两个元素的整形数组,注意指向的是数组。int (*a)[2]
可以理解为a是一个指向int[4]的一维数组,也可以理解为指向一个指针(数组退化到指针);可以用二维数组名直接赋值;
int a[][2] = {{1,2},{3,4}}; int (*b)[2]; //因为可以把二维数组看成一个一维数组的数组,而数组指针是指向一个一维数组的指针,所以可以直接赋值。 b = a; //因为a[0]是一个一维数组的数组名,所以把一个一维数组的地址给数组指针没有问题。 b = &a[0];
指针与函数(了解)
函数指针:本身地址,指向一个函数入口地址,通过该指针可调用其指向的函数,使用函数指针可实现回调函数。
指针函数:本身是一个函数,返回值是一个指针。