c语言-数组

170 阅读4分钟

数组

一、一维数组的创建和初始化

数组是一组相同类型元素的集合

一维数组的基本形式:元素类型 数组名[元素个数]={...}

例:

int arr[3]={1,2,3};

*1. *在{}内输入一组相同类型的元素就是对数组进行初始化

*2. *[ ]内的元素个数可以省略,数组的大小会根据初始化的内容来确定

例:

char arr1[4]="abc";
​
char arr2[4]={'a','b','c','d'};

*1. *注意区别两者,arr1是字符串,该写法会自动补充'\0',arr2是字符数组,若初始化的内容未达到所填写的元素个数,才会填充空字符直至满足数组长度

*2. *字符串以'\0'结尾,字符数组是用来存储字符的数组,不一定包含'\0'

*3. *字符串一定是字符数组,字符数组不一定是字符串

*4. *字符串指定的长度必须 表面上的初始化内容自动填充的'\0',否则会导致编译错误

二、一维数组的使用

数组元素的访问和使用通过下标引用操作符[]实现

例:打印数组的元素

#include <stdio.h>
int main()
{
int arr[3]={1,2,3};
int i=0;//下标从零开始
for (i=0;i<3;i++)
{
printf("%d ",arr[i]);
}
return 0;
}

三、一维数组在内存中的存储

例:

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

输出的结果为:

image.png

每个元素的地址相差四个字节

因此,一维数组在内存中是连续存放的

四、二维数组的创建和初始化

创建的基本形式:

元素类型 数组名[行数] [列数]

如:

int arr[3] [4]
​
char ch[2] [3]
​
double arr2[3] [5]
​

初始化:

int arr[2] [3]={1,2,3,4,5,6};
​
int arr[2] [3]={{1,2},{3,4}};

二维数组的初始化行可以省略,列不可省略,因为元素会根据列数排满一行自动排下一行

五、二维数组的使用

同一维数组一样,二维数组元素的访问和使用也是通过下标引用操作符实现的,行和列的下标都是从0开始

六、二维数组在内存中的存储

二维数组可以看作是一维数组的数组,以行为单位在内存中连续存放

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

输出结果为:

image.png

七、数组越界

若有n个元素,首元素的下标为0,最后一个元素的下标为n-1,若访问元素时下标不在0~n-1的范围内,这种情况就叫做数组越界,我们并不知道访问的内容是什么,编译器也不一定会报错,因此编写代码时需要注意越界的检查

八、数组作为函数的参数

数组名本质上是首元素的地址,我们将数组作为参数传递给函数时,传递的是首元素的地址

例:将一个整型数组按升序排序

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    //每轮外循环后出现一个冒泡数,即最大值
    //当除最后一个元素之外的冒泡数都出现后,最后一个元素也排好了,因此进行sz-1次外循环
    {
        int j = 0;
        for (j = 0; j < sz - 1 - i; j++)//sz-1-i表示每轮外循环中冒泡数无需再进行比较+排序
        {
            if (arr[j] > arr[j + 1])//每轮外循环中相邻两元素进行比较
                                    //大的元素往后冒泡
            {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}
int main()
{
    int arr[] = { 6,4,2,8,0,9,1 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    bubble_sort(arr, sz);
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

整体逻辑:

1. bubble_sort函数中,外循环→找出冒泡数,内循环→寻找冒泡数的具体操作

2. main函数中,创建数组并打印排序后的数组元素

若sz放入bubble_sort函数计算,而不是主函数计算,即:

void bubble_sort(int arr[], int sz)
{
    int i = 0;
​
•   int sz=sizeof(arr)/sizeof(arr[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;
•           }
•       }
•   }
}

则sz的计算结果为1,因为arr作为首元素的地址传递给函数,int arr[]是一个指针变量:int* arr,所占内存大小与一个元素所占内存相同

在main函数内部用sizeof(数组名),计算的是整个数组所占内存空间