1. 二维数组
1.1 定义
定义格式:存储类型 数据类型 数组名[行数][列数];
int arr[2][3]={1,2,3,4,5,6};//定义一个两行三列的二维数组
1.2 访问
数组名[行下标][列下标] //下标从零开始
注意:(数组越界) 行 、列都不能越界 , 定义时可以省略行数, 不可以省略列数
1.3 二维数组的个数和大小
1.个数: 二维数组的个数=行数*列数
sizeof(数组名)/sizeof(数据类型)
2.大小:二维数组的大小=数据类型*行数*列数
sizeof(数组名)
补充:数组名:首地址
arr:第一行的首地址
arr[0]:第一行第一列的首地址
1.4 初始化
1.全部赋值:int arr[2][3]={1,2,3,4,5,6};//顺序赋值
int arr[2][3]={{1,2,3},{4,5,6}};//按行存储
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
3.不初始化:int arr[2][3];//随机值
arr[0][0]=1;//每个元素单独赋值
1.5 内存遍历
定义arr[2][4],和一维数组不一样的是,当用数组名遍历时,数组名+1,代表的是第二行的地址。
2.指针
2.1 优点
1.使程序更简洁、紧凑、高效 这个有点不算是指针比较鲜明或者独特的点
2.有效的表达更复杂的数据结构
3.动态分配内存 合理利用空间
4.得到多于一个数的函数返回值 容易实现函数的编写和调用。
2.2 概念
1. 地址:内存空间的编号
2. 指针:内存地址
3. 指针变量:用来存储内存地址的变量
2.3 定义
存储类型 数据类型 * 变量名;
例如:int *p;//指针变量p
注意:指针的数据类型 是由其将要存储的数据类型决定
2.4 指针和所指变量的关系
*p==值 p==地址
例如:int *p = a;
*p就是a的值,p就是a的地址
2.5指针的操作符
&:取地址 *:取内容 &p:指针变量的地址 *&a=a; &*a;错误
2.6 初始化
1、存储普通变量的地址
int a = 0;
int *p = &a;
2、存储数组的地址
int arr[] = {};
int *p = arr;
3、将指针的指向赋值给另一个指针
int a = 0;
int *p = &a;
int *q = p;
2.6 指针的运算
1. p+n:向高地址方向移动,移动一个数据单位,p本身的指向不会发生变化
2. p-n:向低地址方向移动,移动一个数据单位,p本身的指向不会发生变化
3. p++:向高地址方向移动,移动一个数据单位,p本身的指向会发生变化
4. p--:向低地址方向移动,移动一个数据单位,p本身的指向会发生变化
注意:int *p; p++//移动4个字节
char *q;q++//移动一个字节 1
欢迎大家指正!!!