二维数组的创建和初始化
二维数组的创建
//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
二维数组的初始化
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}}; //局部已初始化,剩下部分将自动填充0
int arr[][4] = {{2,3}} //在定义二维数组时,可以省略行,不能省略列
二维数组是特殊的一维数组
二维数组的使用
对二维数组进行赋值的方法。
#include<stdio.h>
int main(){
int arr[3][4] = { 0 };
int i = 0;
for (i = 0; i < 3; i++){
int j = 0;
for (j = 0; j < 4; j++){
arr[i][j] = i * 4 + j;
}
}
for (i = 0; i < 3; i++){
int j = 0;
for (j = 0; j < 4; j++){
printf("%d\n", arr[i][j]);
}
}
return 0;
}
打印出二维数组的每个元素的位置地址
#include<stdio.h>
int main(){
int arr[3][4];
int i = 0;
for (i = 0; i < 3; i++){
int j = 0;
for (j = 0; j < 4; j++){
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
数组作为函数参数
数组名在两种情况下会代表整个数组:
①sizeof(数组名)
,计算整个数组的大小,sizeof
内部单独放一个数组名,数组名表示整个数组。
②&数组名
,取出的是数组的地址。&数组名
,数组名表示整个数组。
以冒泡排序为例:
#include<stdio.h>
void bubble_sort(int arr[], int size){
//i代表趟数
for (int i = 0; i < size - 1; i++){
for (int j = 0; j < size - 1 - i; j++){
if (arr[j]>arr[j + 1]){
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void ShowArr(int arr[],int size){
for (int i = 0; i < size; i++){
printf("%d", arr[i]);
}
printf("\n");
}
int main(){
int arr[] = { 3, 1, 7, 5, 8, 9, 0, 2, 4, 6 };
int size = sizeof(arr) / sizeof(arr[0]);
ShowArr(arr, size);
bubble_sort(arr, size);
ShowArr(arr, size);
return 0;
}
练习1:下面代码的运行结果:
#include<stdio.h>
int main(){
int arr[] = {1,2,(3,4),5};
printf("%d\n", sizeof(arr));
return 0;
}
对于arr
数组里面共有4个元素,其中(3,4)
为逗号表达式,取后者,因此数组中的元素分别为1,2,4,5
,而sizeof(arr)
求的是整个数组所占空间的大小即4*sizeof(int) = 4*4 = 16
补充:数组的下标由小到大,地址由低到高这点是随系统决定的,一般而言是这样。
练习2:创建一个整型数组,完成对数组的操作
①实现init()
初始化数组全为0
②实现printf()打印数组的每个元素
③实现reverse()函数完成数组元素的逆置
#include<stdio.h>
void Init(int arr[],int size){
int i = 0;
for (i = 0; i < size; i++){
arr[i] = 0;
}
}
void Print(int arr[], int size){
for (int i = 0; i < size; i++){
printf("%d\n", arr[i]);
}
printf("\n");
}
void Reverse(int arr[], int size){
int left = 0;
int right = size - 1;
while (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main(){
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int size = sizeof(arr) / sizeof(arr[0]);
//Init(arr, size);
Print(arr, size);
Reverse(arr, size);
}
练习3:交换数组,将数组A中的内容与数组B中的内容进行交换
#include<stdio.h>
int main(){
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = {11,12,13,14,15,16,17,18,19,20};
for (int i = 0;i < 10; i++){
int tmp = arr1[i];
arr1[i] = arr2[i];
arr2[i] = tmp;
}
return 0;
}
#include <stdio.h>
int main()
{
int arr1[10] = {0};
int arr2[10] = {0};
int i = 0;
printf("请输入10个数字:>");
for(i=0; i<10; i++)
{
scanf("%d", &arr1[i]);
}
printf("请输入10个数字:>");
for(i=0; i<10; i++)
{
scanf("%d", &arr2[i]);
}
//交换
for(i=0; i<10; i++)
{
int tmp = arr1[i];
arr1[i] = arr2[i];
arr2[i] = tmp;
}
return 0;
}