一、二维数组:
1、定义:
定义格式:存储类型 数据类型 数组名[行数][列数];
int arr[2][3]={1,2,3,4,5,6};//定义一个两行三列的二维数组
2、访问:
访问元素:数组名[行下标][列下标] //下标从零开始
注意:数组越界 行 列都不能越界
arr[0][0]----》1
arr[1][2]----》6 存储:先存储行 再存储列
第二行第一个数:arr[1][0]
定义时:
int arr[][3]={1,2,3,1,2,3}; //两行三列的数组
int arr[2][]={1,2,3,1,2,3}; //错误
定义时可以省略行数 不可以省略列数
3、二维数组的个数和大小
二维数组的个数:二维数组的个数=行数*列数
sizeof(数组名)/sizeof(数据类型)
二维数组的大小:二维数组的大小=数据类型*行数*列数
sizeof(数组名);
数组名:首地址 arr:第一行的首地址 arr[0]:第一行第一列的首地址
4、初始化:
4.1.全部赋值:
int arr[2][3]={1,2,3,4,5,6};//顺序赋值
int arr[2][3]={{1,2,3},{4,5,6}};//按行存储
4.2.部分赋值:
int arr[2][3]={1,2,3,4};//顺序赋值 1 2 3 4 0 0
int arr[2][3]={{1,3},{4}};//按行存储 1 3 0 4 0 0
4.3.不初始化
int arr[2][3];//随机值
arr[0][0]=1;//每个元素单独赋值
4.4 二维数组的遍历
二、指针
1、定义
存储类型 数据类型 * 变量名;
例:int *p;//指针变量p
2.指针和所指变量的关系:
int a=10;
int *p=&a;
a===*p &a====p
3.指针的操作符:
&:取地址
*:取内容
&p:指针变量的地址
*&a=a;
&*a;错误
4.初始化:
4.1 存储普通变量
int a=10;
int *p=&a;;//定义时就同时赋值
int *p=NULL;
int b=1;
p=&b;
4.2 存储数据的地址
int a[2]={1,2};
int *p=a;
int *q=&a[1];
char str[]="hello"
char *p=str;
char *p="hello";
4.3 将指针指向赋值给另一个指针
int *p=&a;
int *q=p;
5、指针的运算
包括:+、-、++、--
p+n:向高地址方向移动,移动一个数据单位,p本身的指向不会发生变化
p-n:向低地址方向移动,移动一个数据单位,p本身的指向不会发生变化
p++:向高地址方向移动,移动一个数据单位,p本身的指向会发生变化
p--:向低地址方向移动,移动一个数据单位,p本身的指向会发生变化
例如:
int *p; p++//移动4个字节
char *q;q++//移动一个字节
偏移了多少地址(字节) = n*sizeof(数据类型)
两个地址之间的差 = 两个地址之间相隔元素的个数
(p+4)- p = 之间相隔元素的个数 = 4