数组的相关知识
1.一维数组的定义:
数组是指可以在内存中连续存储多个元素的结构,与变量不同的是变量是存取一个变量的容器;并且需要注意的是数组中所有的元素是具有相同的结构类型。数组的定义与变量相同。
2.一维数组的类别:
可以是所有的基本类型,比如:int、char、float、long、unsigned、double等。
3.一维数组的一般形式:
数组名【下标】,下标的取值范围是从0到数组元素个数(数组长度)减1
例如:数组 arr[5]的元素下标就是从0到4.
数组的创建方式:
type_t arr_name [const_n];
type_t 指数组的元素类型
const_n 是常量表达式,指定数组的大小
常见错误:
int count=10;
int arr2[count]; 数组大小不能为变量,[]中只能给一个常量
★一维数组的初始化:给所有元素初始化——int a[10]={0} 即初始化整形数组a的十个元素都为0;
或者给部分元素初始化—— inta[10]={1,2,3}这种方法是数组前三个分别初始化为1,2,3而之后的都为0。
或者逐个元素a[10]={1,1,1,1,1,1,1,1,1,1}。
注意a[]={1,2,3,4,5}这种是可以的不给出数组元素个数。
char arr1[3]={'a',98,'c'}; 正确的初始化
char arr2[]={'a','b','c'} ;正确的初始化
char arr3[]=''abcdefg''; 正确的初始化
数组在创建的时候如果不想指定数组的大小就得初始化,数组元素的个数可以根据初始化的内容来确定
4.一维数组的使用:
1.数组是使用下标来访问的,下标是从0开始
2.数组的大小可以通过计算得到
例如:int arr[10];
int sz=sizeof(arr)/sizeof(arr[0]);
一维数组在内存中的存储:数组在内存中是连续存放的
#include<stdio.h>
int main()
{
int arr[10]={0};
int i=0;
for(i=0;i<sizeof(arr)/sizeof(arr[0]);++i)
{
printf("&arr[%d]=%p\n",i,&arr[i]);
}
return 0;
}
运行结果表明:随着数组下标的增长,元素的地址也在有规律的递增
指针可以理解为一个变量,专门用来存放地址的一个变量
int *ptr=NULL;定义一个整形的指针变量,初始化为NULL
char *ptr=NULL;定义字符指针
int n=10;
int *p_n=&n;
*p_n=20;
5.二维数组
★定义:若一个一维数组,它的每一个元素 也是类型相同的一维数组,便构成二维数组,所谓数组的类型相同是指数组大小、元素类型相同。
定义形式与一维数组类似:
存储类别 类型标识符 数组名标识符[常量表达式 1][常量表达式 2]
例如 :int a[3][[4]; float b[4][5];
数组a元素排列顺序如下:
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
★初始化:给所有元素赋值 int a[2][3]={1,2,3,4,5,6} 每个元素值为 a[0][0]=1;a[0][1]=2;a[0][2]=3;a[1][0]=4;a[1][1]=5;a[1][2]=6.
分行赋值 例如:int a[2][3]={{1,2},{3,4},{5,6}};
部分元素初始化 例如:int a[2][3]= {{1,2},{4},{6}};未初始化的元素为0
注意:二维数组的行可以省略,但是列必须写明
int arr[][4]={{2,3},{4,5}};
6.二维数组的指针访问
迅雷的笔试题,代码如下
- #include <iostream>
- using namespace std;
- const int row = 2, col = 3;
- int main()
- {
- int a[6][9];
- cout << a[row][col] << endl;
- *(*(a+row)+col) = 10;
- cout << a[row][col] << endl;
- return 0;
- }
a是一个int **类型的指针。表达式*(a+row)返回一个int *类型的指针。*(a+row)+col还是一个int *类型指针
所以,*(*(a+row)+col)就是一个int类型的变量了。
int a[3][4]={0};
printf("%d\n",sizeof(a)); 48 12x4=48
printf("%d\n",sizeof(a[0][0])); 4
printf("%d\n",sizeof(a[0])); 4x4=16 表示第一行所有元素所占空间的大小
printf("%d\n",sizeof(a+1)); 4 表示第一行加一则为第二行地址
printf("%d\n",sizeof(&a[0]+1)); 4 第二行的地址
printf("%d\n",sizeof(*a)); 16 第一行所有元素所占空间大小
printf("%d\n",sizeof(a[3])); 16 sizeof内部不做任何运算
总结:数组名代表整个数组的时候只有两种情况
其一:sizeof(数组名),这里的数组名代表整个数组
其二:&数组名,这里的数组名表示整个数组
数组作为函数参数的时候,不会把整个数组传递过去,实际上是把数组首元素地址传递过去了,所以即使在函数参数部分写成数组形式:int arr[]表示的依然是一个指针:int *arr