数组是一种构造数据类型,其由一定顺序关系的多个变量组成,这些变量被称为数组的元素。数组中的元素具有相同的数据类型,并且可以使用数组名和下标来确定。数组可以是一维的,也可以是多维的。
一维数组的定义
当谈及一维数组时,指的是在计算机内存中连续存储8的仅含有一个下标的数组。C语言中,一维数组通常以以下形式进行说明:<存储类型> <数据类型> <数据名>[<表达式>]。
例如:int a[6]
编译时,内存会被分配成连续的空间,其分配空间的字节数=数组维数*sizeof(元素数据类型)。另外,数组名表示内存的首地址,即为地址常量。
int main(int argc,char *argv[])
{
int a[6],i;
for(i=0;i<6;i++)
printf("%p\n",&a[i]);
retun 0
}
int main(int argc,char *argv[])
{
int a[6],i;
for(i=0;i<6;i++)
printf("%p\n",&a[i]);
a=a+1; //数组名为地址常量,无法参与计算。假如数组名被改变,那么数组的存储位置将无法被定位。
printf("%p\n",a);
pritf("%d\n",sizeof(a));
return 0;
}
一位数组注意事项
在C语言中,对数组的访问不会自动进行越界检查,因此在使用数组时应特别注意(不能依赖编译器检查)。例如,对于定义“int a[5]”的数组,访问“ints[5]”是越界访问,这可能会导致未定义的行为。另外,在使用变量定义数组维度时,例如“int i = 15;int a[i];”这样的定义是合法的,并且可以根据变量“i”的值来确定数组的维度大小。
这种情况下,如果变量“i”的值在运行时发生变化,数组的大小也会随之改变。这对于某些特定的编程场景可能很有用。但也需要谨慎使用,以避免不必要的内存错误或意外结果。
一维数组的引用
在C语言中,数组必须先进行定义,然后才能被使用。它们只能逐个引用数组元素,而不能一次引用整个数组。数组元素通常表示为数组名后跟方格号–数组名[下标]。下标可以是常量,也可以是整型表达式。
int a[10];
//printf("%d",a); //错误示例,只声明未定义的情况下,直接使用。
for(j=0;j<10;j++)
printf("%d\t",a[j]);//正确示例。
一维数组的初始化
在c语言中,有多种方式可以将数组进行初始化。一种常见的方式是在定义数组时为数组元素赋初值,例如“int a[5] = {1,2,3,4,5}”。值得注意的是:
- 如果未对数组进行初始化,则其元素值将是随机的。
- 对于静态(static)数组,如果不给元素赋初值,系统会自动将其赋值为0.
- 另外,也可以只给数组的部分元素赋初值,未指定的元素将会被自动赋初值为0.
static int a[5];
//等价于:a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;
int a[5]={6,2,3};
等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;
int a[3]={6,2,3,5,1};
//错误声明
int a[]={1,2,3,4,5,6};
//编译器系统根据初值个数确定数组维数
冒泡排序
冒泡排序是一种基本的排序算法,它重复地遍历要排序的列表,比较每对相邻项,并依次交换顺序不合适的元素。通过多次遍历,每一轮都会将当前未排序部分中的最大(或最小)元素移动到已排序部分的末尾。这样经过多轮遍历之后,整个列表就会变得有序。
具体来说,冒泡排序的步骤如下:
- 从列表的第一个元素开始,依次比较相邻的两个元素。
- 如果顺序不正确(例如,一个较大的数在前面,较小的数在后面),则交换这两个元素的位置。
- 继续向后遍历列表,重复进行比较和交换的步骤,直到到达列表的末尾。
- 重复执行上述步骤,直到整个列表都变成有序序列为止。
冒泡排序的时间复杂度为 O(n^2),其中 n 是列表中元素的数量。由于其效率较低,冒泡排序通常不适用于处理大规模数据集,但在某些特定情况下仍然可以作为一种简单的排序方法。
int main(int argc,char *argv[])
{
int a[]={3,4,17,8,31,2,9,15},n,i,j;
int t ;
n=sizeof(a) / sizeof(int);
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
t= a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
/*
外循环:
外循环的作用是控制遍历列表的轮数。每一轮外循环都会确保列表中最大
(或最小)的元素被移动到正确的位置上,因此需要进行 n-1 轮遍历,其中 n 是列
表的长度。
内循环:
内循环负责执行相邻元素的比较和交换操作。通过内循环,可以逐个比较相邻
的元素,并在需要的情况下进行交换。内循环确保每一轮外循环能够将当前未排序部分
的最大(或最小)元素移动到已排序部分的末尾。
*/