二维数组的定义
a[][3]这里的3表示总共有3列,但是取值二维数组的最后一个元素是a[2][2]
二维数组的取值
①数组定义时可以不初始化。
char arr[5]; 5个字符对应的ASCII码组成的数组// 定义了一个长度为 5 的 char 型数组,不指定初始值
在计算机中所有数据必须以数字形式表示,每个字符用一个数字表示(数字即字符对应的ASCII码),数字在0-127之间,故选用char型表示
char ch=65;//ch表示大写字母‘A’
char ch1=49;//ch1表示数字‘1’
虽然数组可能全部都是数字,但是类型为char时则表示为数字对应的ASCII码
注意:
int arr[5];
数组未初始化,所以每个元素的值都是乱七八糟的值(随机值),arr[0]+arr[1]的值随机
②初试化可赋值为全0
char arr[5] = { 0 };则所有元素的值都是 0
arr[0] 的值是22, 后面的元素的值都是0
③元素的下标从 0 开始计算(数组打印不像Python中直接通过打印数组名实现)
错误,不用用此方法,如果要打印数组一定是用for循环来打印
④用 sizeof 取得数组的大小
数组的大小由元素的类型和元素的个数共同决定。
int arr[100];
int size = sizeof(arr); // 大小为 100*4
数组作为形参(加*)
数组作为形参传入时,传入的是数组的首地址
int* arr,表示一个int数组的首地址,然后只需要for循环处理数组中的元素即可,不用多考虑*
int find_min(int* arr, int size)
{
int min = arr[0];
for (int i = 1; i < size; i++)
{
if (arr[i] < min)
{
min = arr[i];
}
}
return min;
}
二维数组
1、定义:
int array[4][4];
array[2][3] = 128; // 对坐标(3,4)位置进行赋值
下标依然是从0开始
2、二维数组的初始化
使用多个大括号,一行行初始化
①二维数组的取值
只取出一维的理解
从调试过程可以看出只有每行的第一个元素是有值的,这很像一维数组中只定义一个元素的情况
②数组指定行元素清零(memset函数实现)
自己思路:用嵌套for循环实现清零
方法2:内存重置函数memset函数
#include <stdio.h>
#include <string.h>
int main()
{
int arr[3][10];
// 第2行的首地址
// 第2行的大小(按字节计算)
memset(&arr[1][0], 0, 10*4);
return 0;
}
③指定两行数据的交换(使用memcpy函数:目的内存,地址,字节)
int arr[3][5] =
{
{ 1, 1, 1, 3, 3},
{ 2, 2, 12, 13, 14},
{ 5, 6, 7, 0, 1}
};
printf("%d\n", arr[1][0]);//打印一行用什么格式?不能直接打印arr[1]
char* buf = (char*)malloc(5 * 4);//定义一个新的内存,指定字节数
memcpy(buf,&arr[1][0],20);//第二行的首地址,赋值给buf
memcpy(&arr[1][0], &arr[2][0], 20);
memcpy(&arr[2][0], buf, 20);
printf("%d\n", arr[1][0]);
free(buf);
定义了memcpy函数就要使用头文件stdlib.h
取二维数组的方法:直接取出每一行第一个元素的首地址,通过memcpy函数实现整行的赋值(通过for循环取出一行,格式%d)
申请了内存使用了malloc函数,先将free函数在后面写出,避免遗忘(养成好的习惯)
编程:
自己思路:
int arr[11] = { 12, 8, 99, 28, 19, 23, 98, 12, 34, 48, 98 };
int count = 0;
for (int i = 0;i <= 10;i++)
{
printf("%2d",arr[i]);
count++;
if (count == 4)
{
printf("\n");
count = 0; //清零容易漏掉
}
else
printf(" ");
}
这里不需要定义count变量,每到四个数就打印换行,否则打印数组元素+空格
另外注意要求的输出格式,右对齐使用%2d
int arr[11] = { 12, 8, 99, 28, 19, 23, 98, 12, 34, 48, 98 };
for (int i = 0; i < 11; i++)
{
if (i % 4 == 0&&i>0)//i>0的目的避免第一行就打印出一个空格
{
printf("\n"); // 每4个数一行
}
printf("%2d ", arr[i]);
}
利用for循环中的i计数,能整除4就打印换行,否则打印数组元素+空格