Mars's Blog

C++ 数组 & 指针

2019-10-23

阅读

C++ 数组 & 指针

​ 注意⚠️:

  1. 数组名代表第一个元素的位置,是一个常量,对数组名取地址的结果是数组的类型。
  2. char(*) [2] 是一种数组类型,表示指向有两个元素的数组的数组指针。
  3. 往char类型存入字符串的话,在字符串末尾加上\0 作为终止符方便下次取用。
  4. 如果结构体有元素是char*/char[] 类型,则在保存值的同时,也要保存长度
  5. 数组作为形参时会退化为指针,因此可以说C++中传递数组永远是传递数组首元素的指针以及长度,后面用memset

首先来看一个int型的一维数组:

1
2
3
4
int a[10] = {1};
cout << &a[0] << endl; // 第一个元素位置
cout << a << endl; // 数组名等价于第一个元素位置 类型是int*
cout << &a << endl; // 类型是整个数组类型 类型是int(*)[10] (指向具有10个int元素的数组的数组指针)

其次是char型的一维数组:

1
2
3
4
5
6
char b[10];
char* p = b; // 指向第一个元素
cout << b << endl; // 会一直往后面输出,直到遇到终止符号
cout << p << endl; // 同理
cout << &b << endl; // 数组的类型是 char(*) [10]
char (*p)[10] = &b; //也可以这样赋值

二维数组 - 可以看作多个一维数组

char a[b][c]

a[0]是一个一维数组的数组名,类型也就是char*

a也就是首元素一维数组的数组名,类型是char (*)[c]

关键:数组名 等价于 首元素的首地址(第一维的首元素是第二维的数组名,第二维的数组名又是第二维的首元素,最终就是最低维的首元素)

1
2
3
4
5
6
7
8
9
char a[3][2];
// 赋值操作
char (*p) [2] = a; // a是第一维数组的数组名
char *p = a[0]; // a[0]是第二维的数组名(一维数组)
char (*p)[3][2] = &a

// 另一种声明数组的方式
typedef char T[2]; //T的类型也就是 int (*)[2]
T a[3];
1
2
3
4
int a[3][2] = {1};
cout << a << endl;
cout << &a[0] << endl;
cout << &a[0][0] << endl;

以上结果均为0x7ffeefbff420

三维数组

char a[b][c][d] 首元素是具有c个元素的一维数组。

1
2
3
4
5
6
7
8
9
10
11
12
char a[3][2][2];
// 赋值操作
char *p = a[0][0]; // 一维数组的数组名
char (*p)[2] = a[0];
char (*p)[2][2] = a;
char (*p)[3][2][2] = &a;

// 另一种声明数组的方式
typedef int C[2]; // C的类型是int (*)[2][2]
typedef C B[2]; // C的类型是int (*)[2]
C a[3];

sizeof与算数运算

1
2
3
4
5
6
7
8
9
10
11
char a[10];
// a + 1 首地址 + sizeof(char)
// &a + 1 首地址 + sizeof(a)
// 不允许 a++ a是常量,不允许自增运算
// sizeof(a) 数组的长度
// sizeof(&a) 第一个指针变量的长度

//举例
int a[10] = {1};
cout << a << endl; // 0x7ffeefbff400
cout << &a + 1 << endl; // 0x7ffeefbff428 相差40个bytes 正好是a的数组长度
参考:

Tags: C++