数组总结

一、一维数组

1.一维数组的创建和初始化

(1)数组创建方式:

type_t  arr_name   [const_n];
//type_t  是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小

注:数组创建,[ ] 中要给一个常量才可以,不能使用变量。

(2)数组初始化:

数组初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
数组在创建的时候如果想不指定数组确定的大小就得初始化。数组元素个数根据初始化的内容来确定。
注意下面三句代码的区分:

char arr1[] = "abc";
//数组arr1里放了四个元素 'a' 'b' 'c' '\0'
char arr2[] = {'a', 'b', 'c'};
//数组arr2里放了三个元素 'a' 'b' 'c'
char* p = "abc";
//这里p是一个字符指针,指向常量字符串 "abc" 的首元素 'a' 的地址

2.一维数组的使用

(1)数组是使用下标来访问的,下标是从0开始;
(2)数组的大小可以通过计算得到。

int arr[10];
int sz = sizeof(arr) / sizeof(arr[0]);

3.一维数组在内存中的存储

一维数组在内存中是连续存放的,地址随下标的增长由低到高(即 下标小的元素占低地址 下标大的元素占高地址)

4.一维数组的指针访问

(1)数组的数组名其实是数组首元素的地址;
(2)通过对数组名+整数的运算,可以获取到数组每个元素的地址;

二、二维数组

1.二维数组的创建和初始化

(1)二维数组的创建

int arr1[3][4];
char arr2[3][5];
double arr3[2][4[];

(2)二维数组的初始化

int arr1[3][4] = {1, 2, 3, 4};
int arr2[3][4] = {{1, 2}, {4, 5}};
int arr3[][4] = {{2, 3}, {4, 5}};

:二维数组创建时,在初始化(赋初值)的情况下,可以省略行数但不可以省略列数

2.二维数组的使用

二维数组也是通过使用下标来访问的

3.二维数组在内存中的存储

二维数组在内存中连续存储

二维数组的数组名也是首元素的地址,但不是第一个元素的地址,它是二维数组第一行的地址,是一个数组指针!

int arr[3][4];

这里写图片描述
arr[0]相当于第一行元素的数组名
arr[1]相当于第二行元素的数组名
arr[2]相当于第三行元素的数组名

三、有关数组的运算

1.一维数组

// ⼀一维数组 
int a[] = {1,2,3,4}; 
printf("%d\n",sizeof(a)); //16 在操作符sizeof中数组名a表示整个数组
printf("%d\n",sizeof(a+0)); //4 数组第一个元素的地址,地址大小为4
printf("%d\n",sizeof(*a)); //4 数组第一个元素的值,整型,所以大小为4
printf("%d\n",sizeof(a+1)); //4 数组第二个元素的地址
printf("%d\n",sizeof(a[1])); //4 数组第二个元素的值,整型
printf("%d\n",sizeof(&a)); //4 &a 整个元素的地址,也是地址
printf("%d\n",sizeof(*&a));//16 取出整个数组的地址,解引用—>数组
printf("%d\n",sizeof(&a+1)); //4 下一块空间的地址,跳过整个数组,也是地址
printf("%d\n",sizeof(&a[0]));//4 第一个元素地址
printf("%d\n",sizeof(&a[0]+1));//4 第二个元素地址
// 字符数组 
char arr[] = {'a','b','c','d','e','f'}; 
printf("%d\n", sizeof(arr)); //6 整个数组
printf("%d\n", sizeof(arr+0)); //4 首元素地址
printf("%d\n", sizeof(*arr)); //1 首元素的值,字符型
printf("%d\n", sizeof(arr[1])); //1 首元素的值,字符型
printf("%d\n", sizeof(&arr)); //4 数组的地址
printf("%d\n", sizeof(&arr+1)); //4 下一块空间的地址
printf("%d\n", sizeof(&arr[0]+1));//第二个元素的地址

printf("%d\n", strlen(arr)); //随机值
printf("%d\n", strlen(arr+0)); //随机值
printf("%d\n", strlen(*arr)); //题出错
printf("%d\n", strlen(arr[1])); //题出错
printf("%d\n", strlen(&arr)); //随机值
printf("%d\n", strlen(&arr+1)); //随机值
printf("%d\n", strlen(&arr[0]+1));//随机值
//因为在这个字符数组里没有'\0'
char arr[] = "abcdef"; 
printf("%d\n", sizeof(arr)); //7 注意区分sizeof和strlen
printf("%d\n", sizeof(arr+0)); //4 第一个元素地址
printf("%d\n", sizeof(*arr)); //1 第一个元素的值,字符型
printf("%d\n", sizeof(arr[1])); //1 第一个元素的值,字符型
printf("%d\n", sizeof(&arr)); //4 数组的地址
printf("%d\n", sizeof(&arr+1));//4 下一块空间的地址
printf("%d\n", sizeof(&arr[0]+1));//4 第二个元素的地址

printf("%d\n", strlen(arr)); //6 计算字符串长度,遇到'\0'结束
printf("%d\n", strlen(arr+0)); //6 数组名是首元素地址
printf("%d\n", strlen(*arr)); //题出错(系统崩溃)
printf("%d\n", strlen(arr[1])); //题出错(系统崩溃)
printf("%d\n", strlen(&arr)); //6 取出的是首元素'a'的地址
printf("%d\n", strlen(&arr+1)); //随机值
printf("%d\n", strlen(&arr[0]+1));//5 取出的是第二个元素'b'的地址
char *p = "abcdef"; 
printf("%d\n", sizeof(p)); //4
printf("%d\n", sizeof(p+1)); //4
printf("%d\n", sizeof(*p)); //1
printf("%d\n", sizeof(p[0])); //1
printf("%d\n", sizeof(&p)); //4
printf("%d\n", sizeof(&p+1)); //4
printf("%d\n", sizeof(&p[0]+1));//4

printf("%d\n", strlen(p)); //6 p指向第一个元素'a',即p存放着'a'的地址,第一个元素之后
printf("%d\n", strlen(p+1)); //5 第二个元素之后
printf("%d\n", strlen(*p)); //题出错(系统崩溃)
printf("%d\n", strlen(p[0])); //题出错(系统崩溃)
printf("%d\n", strlen(&p));//随机值
printf("%d\n", strlen(&p+1));//随机值
printf("%d\n", strlen(&p[0]+1));//5 第一个元素之后,p[0]就是第一个元素
//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); //48 整个数组
printf("%d\n",sizeof(a[0][0]));//4 第一个元素的值,整型
printf("%d\n",sizeof(a[0]));//16 把a[0]看为数组名 第一行
printf("%d\n",sizeof(a[0]+1));//4 第一行第二个元素的地址
printf("%d\n",sizeof(a+1));//4 第二行的地址
printf("%d\n",sizeof(&a[0]+1));//4 第二行的地址
printf("%d\n",sizeof(*a)); //16 首元素地址(第一行地址),之后解引用,4个整型
printf("%d\n",sizeof(a[3]));//16 虽然不存在,但是和a[0]一样,有4个整型

总结:
数组名代表整个数组的时候只有两种情况:
(1) sizeof(数组名), 这里数组名表示整个数组;
(2)&数组名, 这里数组名表示整个数组。
除此之外,所以的数组名都表示首元素地址!

猜你喜欢

转载自blog.csdn.net/eric_qiushui/article/details/78983399