数组:一块连续的空间,存放相同数据类型的数据。
指针数组:就是一个数组,数组里的元素是指针。
多维数组:也是一个数组,数组里的元素是数组。
情景再现
我们知道
char * str = "hello";
这里用的是64位操作系统:
str是一个指针,指向一个字符串,字符串里面的内容是hello。
一个指针所占内存是8个char类型的大小,也就是8个字节(Byte)。
"hello"字符串有5个字母,每个字母占一个char,另外末尾其实有一个’\0’的结尾符,也在一个char。所以一般字符串大小是字符串的能看到的长度(ASCII码里的字符)+ 一个’\0’的大小。这里就是6个字节(Byte)。
用sizeof运算符
#include <stdio.h>
int main()
{
char* str = "hello";
printf("str pointer length : %d\nstr length:%d\n", sizeof(str), sizeof("hello"));
printf("other pointer length :%d ,%d\n", sizeof(int*), sizeof(double*));
}
一个char* p可以存一个字符串,那么需要更多的字符串,就要声明更多的指针。
char * str = "hello";
char * str2 = "nice";
char * str3 = "ok";
...
这样很累,是不是。
所以就有了指针数组。
char* str_arr[]={
"hello",
"nice",
"ok"
};
当然也可以这样
char* p = "uu";
char* str_arr[]={
p,
"hello",
"nice",
"ok"
};
怎么访问呢?
#include <stdio.h>
int main()
{
char* p = "ux";
char* str_arr[] = {
p,
"hello",
"nice",
"ok"
};
// 下标方式访问 数组名[下标]
printf("%s\n", str_arr[0]);
printf("%s\n", str_arr[1]);
printf("%s\n", str_arr[2]);
// 指针方式访问 *(数组名+指针移动量)
printf("%s\n", *str_arr);
printf("%s\n", *(str_arr+3));
}
对应字符串里的字符怎么访问呢?
// 方式1 数组+数组
printf("%c\n", str_arr[0][0]);
printf("%c\n", str_arr[0][1]);
printf("========\n");
// 方式2 数组+指针
printf("%c\n", *str_arr[0]);
printf("%c\n", *(str_arr[0]+1));
printf("========\n");
// 方式3 指针+数组
printf("%c\n", (*(str_arr + 2))[0]);
printf("%c\n", (*(str_arr + 2))[1]);
printf("========\n");
// 方式4 指针+指针
printf("%c\n", *(*(str_arr + 3)));
printf("%c\n", *((*(str_arr + 3))+1));
printf("========\n");
一般来说指针数组的大小等于,数组里元素的个数x指针的大小(8Byte)
每个指针指向的空间大小不一样,加起来就是
∑
i
=
0
n
n
i
\sum_{i=0}^nn_i
∑i=0nni,其中
n
i
n_i
ni为指针指向内存块的大小。
所以一共需要
∑
i
=
0
n
n
i
\sum_{i=0}^nn_i
∑i=0nni+
∑
i
=
0
n
8
n
\sum_{i=0}^n8n
∑i=0n8n字节。
多维数组
最容易想到的就是矩阵
(
1
2
3
4
5
6
7
8
9
)
\left( \begin{array}{lcr} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{array} \right)
⎝⎛147258369⎠⎞
int m1[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
怎么访问呢?
// 第一种
printf("%d\n", m1[1][1]); // 5
// 第二种
printf("%d\n", m1[0][4]); // 5
// 第三种
printf("%d\n", (*m1)[4]); // 5
// 第四种
printf("%d\n", *(*m1+4)); // 5
// 第五种
printf("%d\n", *(m1[0])+4); // 5
printf("%d\n", *(m1[2])-2); // 5
// 第六种
printf("%d\n",*(*m1+4)); // 5
下面是内存占用分析
拿二维的举例,一般都类似这种 int a[3][4]; float b[4][5];
抽象一下 T x[n][m]
元素个数
n
∗
m
n*m
n∗m
T大小sizeof(T)
所以总大小
n
∗
m
∗
s
i
z
e
o
f
(
T
)
n*m*sizeof(T)
n∗m∗sizeof(T)
!!!
这就是几种茴香豆里回字的几种写法了。