day06
一、二维数组:
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]:第一行第一列的首地址
(虽然表示的数据是一样的,但是优先级不同,arr更高)
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;//每个元素单独赋值
练习:
答案:A
答案:C
5、内存分配:
arr和arr[0]数值是一样的,但是级别不同
二维数组的遍历:
for循环,双重for ,外层控制行数(下标) 内层列数(下标)
#include <stdio.h>
#define M 2
#define N 3
int main(int argc, char const *argv[])
{
int arr[M][N] = {};
// 输入:
for (int i = 0; i <M; i++)
{
for (int j = 0; j < N; j++)
{
scanf("%d",&arr[i][j]);
}
}
//输出:
for (int i = 0; i <M; i++)
{
for (int j = 0; j < N; j++)
{
printf("%d ",arr[i][j]);
}
}
return 0;
}
练习:
有一个3x4的矩阵(元素值不相同),要求输出其中最大值以及它的行号和列号
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arr[3][4] = {};
// 输入:
for (int i = 0; i <3; i++)
{
for (int j = 0; j < 4; j++)
{
scanf("%d",&arr[i][j]);
}
}
// int max=0;
int h=0;
int l=0;
for (int i = 0; i <3; i++)
{
for (int j = 0; j <4; j++)
{
if(arr[h][l]<arr[i][j]){
h=i;
l=j;
}
}
}
// arr[h][l] h+1 l+1
return 0;
}
二、 指针
指针的优点:
1. 使程序更简洁、紧凑、高效 这个有点不算是指针比较鲜明或者独特的点
2. 有效的表达更复杂的数据结构
3. 动态分配内存 合理利用空间
4. 得到多于一个数的函数返回值 容易实现函数的编写和调用。
概念:
地址:内存空间的编号
指针:内存地址
指针变量:用来存储内存地址的变量
1.定义:
存储类型 数据类型 * 变量名;
例:int *p;//指针变量p
注意:指针的数据类型 是由其将要存储的数据类型决定
char a='a';
char *p=&a;
2.指针和所指变量的关系:
int a=10;
int *p=&a;
a===*p &a====p
3.指针的操作符:
&:取地址
*:取内容
&p:指针变量的地址
*&a=a;
&*a;错误
4.初始化:
1、 存储普通变量的地址
1.1:
int a=10;
int *p=&a;//定义时就同时赋值
1.2:一开始指针没有定义
int *p=NULL;
int b=1;
p=&b;
2、 存储数组的地址
int a[2]={1,2};
int *p=a;
int *q=&a[1];
char str[]="hello"
char *p=str;
char *p="hello";
3、 将指针的指向赋值给另一个指针
int *p=&a;
int *q=p;
5.指针的运算:
5.1算术运算:+ - ++ --
p+n:向高地址方向移动,移动一个数据单位,p本身的指向不会发生变化
p-n:向低地址方向移动,移动一个数据单位,p本身的指向不会发生变化
p++:向高地址方向移动,移动一个数据单位,p本身的指向会发生变化
p--:向低地址方向移动,移动一个数据单位,p本身的指向会发生变化
int *p; p++//移动4个字节
char *q;q++//移动一个字节
偏移了多少地址(字节) = n*sizeof(数据类型)
两个地址之间的差 = 两个地址之间相隔元素的个数
(p+4)- p = 之间相隔元素的个数 = 4
int arr[5] = {1, 2, 3, 4, 5};
int *p1 = arr, *p2 = arr + 4;
printf("%d %d\n", *p1, *p2);
printf("%d\n", p2 - p1);//4
练习: