C语言学习笔记(四)数组

arongsec / 2023-07-22 / 原文

数组

一维数组的创建和初始化

//创建
类型 数组名 [元素个数];

int arr[10];
char arr2[5];

//初始化
int arr[10]={1,2,3}; //不完全初始化
char arr[5]={'a','b'};
char arr3[5]="ab";// 每一位为:a,b,末尾有\0

char arr6[]="abcdef"; //没有确定长度则必须进行初始化,根据初始化的内容自动确定长度

一维数组的使用

#include<stdio.h>
#include<string.h>
int main()
{
    int i,n,sz1,sz2;
    int arr1[]={1,2,3,4,5};
    sz1=sizeof(arr1)/sizeof(arr1[0]);
    char arr2[]={'a','b','c'};
    sz2=strlen(arr2);
    for(i=0;i<sz1;i++)
    {
        printf("%d ",arr1[i]);
    }
    printf("\n");
    for(n=0;n<sz2;n++)
    {
        printf("%c ",arr2[n]);
    }
    return 0;
}

一维数组在内存中的存储

数组在内存中是连续存放的

二维数组的创建和初始化

//创建
类型 数组名[行数][列数];
int arr[3][4];
char ch[3][5];
double arr[3][4];

//初始化
int arr[3][4]={1,2,3,4};
int arr[3][4]={{1,2},{4,5}};
int arr[][4]={{2,3},{4,5}};           //注意:列绝对不能省略!只能省略行!

易错点:

int a[3][3]; ————————>数字3,3代表这个数组有3行3列  是几就是几
a[2][1] —————————————>数字2,1代表第3行第2列  =下标+1

二维数组的使用

#include<stdio.h>
int main()
{
    int arr[3][4]={{1,2,3},{4,5}};
    int i,j;
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

二维数组在内存中的存储

二维数组在内存中其实是连续存储的,即每一行和下一行首位相连

image-20230719142541127

数组作为函数的参数

冒泡排序实现数组以升序排列

相邻元素两两比较,例: 5 4 3 2 1

先排5

​ 5 4 3 2 1

—>4 5 3 2 1

—>4 3 5 2 1

—>4 3 2 5 1

—>4 3 2 1 5 //一趟冒泡排序,比较了4对


再排4

—>3 4 2 1 5

—>3 2 4 1 5

—>3 2 1 4 5


再排3

—>2 3 1 4 5

—>2 1 3 4 5


再排2

—>1 2 3 4 5

n个元素需要n-1趟冒泡排序

#include<stdio.h>

void bubble_sort(int arr[],int sz)//虽然arr[](注意此处的括号不可以省略!!!!)本质是一个指针,但是不能写成int*
{
    //确定冒泡排序的趟数
    int i = 0;
    for(i=0;i<sz-1;i++)
    {
        int j =0;
        //确定每一趟要对比的对数
        for(j=0;j<sz-1-i;j++)
        {
            if(arr[j]>arr[j+1])
            {	//不满足条件则交换两个数的位置
                int tmp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=tmp;
            }
        }
    }
}

int main()
{
    int i=0;
    int arr[]={9,8,7,6,4,5,3,2,1,0};
    int sz = sizeof(arr)/sizeof(arr[0]);
    bubble_sort(arr,sz);
    for(i=0;i<sz;i++)
    printf("%d ",arr[i]);
    return 0;
}

数组名是什么意思?

arr 代表数组的首元素的地址,(所以不能随意乱用arr)但有两个例外:

sizeof(arr); 此处的arr代表的是整个数组

&arr arr代表整个数组,此处取的是整个数组的地址,&arr+1代表跳过整个数组以后的第一个地址