个人博客网址:https://ljsblog.com
数组(四)
数组是一组相同类型元素的集合
一维数组的创建方式
数组元素类型 数组名[常量表达式];
例:
//例1
int arr1[10];
//例2
char arr2[3];
float arr3[5];
double arr4[10];
//错误示例
int n=10;
int arr5[n];//创建数组时,[]中要给一个常量,不能使用变量
一维数组的初始化
//完全初始化,定义数组时给所有元素赋初值,例:
int arr[5]={1,2,3,4,5};
//不完全初始化,给数组中部分元素赋初值,其余元素自动为0:例:
int arr1[5];={1,2};//a[0]=1 a[1]=2,其余元素自动为0
//如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。例:
int arr2[]={1,2,3,4,5}//数组元素个数自动为5
sizeof和strlen
sizeof:计算变量,类型,数组的大小,单位是字节,sizeof是运算符。
strlen:需要引入头文件string.h,求字符串长度,只能针对字符串,从字符串的开头位置依次向后计数,遇到\0返回字符串长度,字符串长度不包括\0,strlen是函数。
例子:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[]="myblog";
char arr2[]={'m','y','b','l','o','g'};
printf("%d\n",sizeof(arr1));//7
printf("%d\n",sizeof(arr2));//6
printf("%d\n",strlen(arr1));//6
printf("%d\n",strlen(arr2));//随机值
return 0;
}
一维数组的使用
[]是下标引用操作符,数组是使用下标来访问的,下标是从0开始,元素个数是可以通过计算得到的
例:
#include <stdio.h>
int main()
{
int a[]={1,2,3,4,5};
int i=0,sz=0;
sz=sizeof(a)/sizeof(a[0]);
for(i=0;i<sz;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
char a[]="abcde";
int i=0,sz=0;
sz=(int)strlen(a);//strlen返回值是无符号数
for(i=0;i<sz;i++)
{
printf("%c\n",a[i]);
}
return 0;
}
一维数组的存储
数组在内存中是连续存储的,例。
//取数组每个元素地址
#include <stdio.h>
int main()
{
int a[]={1,2,3,4,5};
int i=0,sz=0;
sz=sizeof(a)/sizeof(a[0]);
for(i=0;i<sz;i++)
{
printf("a[%d]=%p\n",i,&a[i]);
}
return 0;
}
/*打印结果为:
a[0]=007DF988
a[1]=007DF98C
a[2]=007DF990
a[3]=007DF994
a[4]=007DF998
*/
二维数组的创建
数组元素类型 数组名[行数][列数];
int arr[3][4];
/*
定义一个3行4列的整型数组,数组名为arr,即
a[0][0], a[0][1], a[0][2], a[0][3]
a[1][0], a[1][1], a[1][2], a[1][3]
a[2][0], a[2][1], a[2][2], a[2][3]
*/
char arr[3][5];//3行5列
double arr[2][3];//2行3列
二维数组的初始化
例1:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
/*
a[0][0]=1 a[0][1]=2 a[0][2]=3 a[0][3]=4
a[1][0]=5 a[1][1]=6 a[1][2]=7 a[1][3]=8
a[2][0]=9 a[2][1]=10 a[2][2]=11 a[2][3]=12
*/
例2:
int a[3][4]={{1,2},{3,4}};
/*
a[0][0]=1 a[0][1]=2 a[0][2]=0 a[0][3]=0
a[1][0]=3 a[1][1]=4 a[1][2]=0 a[1][3]=0
a[2][0]=0 a[2][1]=0 a[2][2]=0 a[2][3]=0
*/
//部分元素初始化,其余元素自动补0
例3:
int a[][4]={{1,2,3,4},{5,6,7,8}};
/*
a[0][0]=1 a[0][1]=2 a[0][2]=3 a[0][3]=4
a[1][0]=5 a[1][1]=6 a[1][2]=7 a[1][3]=8
*/
//创建二维数组中行可以省,列不可以省
二维数组的使用
#include <stdio.h>
int main()
{
int a[3][4]={{1,2,3},{4,5}};
int i=0,j=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("a[%d][%d]=%-2d ",i,j,a[i][j]);
}
printf("\n");
}
return 0;
}
/*
打印结果
a[0][0]=1 a[0][1]=2 a[0][2]=3 a[0][3]=0
a[1][0]=4 a[1][1]=5 a[1][2]=0 a[1][3]=0
a[2][0]=0 a[2][1]=0 a[2][2]=0 a[2][3]=0
*/
二维数组的存储
二维数组在内存中也是连续存储的,例:
#include <stdio.h>
int main()
{
int a[3][4];
int i=0,j=0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("&a[%d][%d]=%p\n",i,j,&a[i][j]);
}
}
return 0;
}
/*
&a[0][0]=0076F914
&a[0][1]=0076F918
&a[0][2]=0076F91C
&a[0][3]=0076F920
&a[1][0]=0076F924
&a[1][1]=0076F928
&a[1][2]=0076F92C
&a[1][3]=0076F930
&a[2][0]=0076F934
&a[2][1]=0076F938
&a[2][2]=0076F93C
&a[2][3]=0076F940
可以看出二维数组每个元素的地址在内存中也是连续的
*/
//二维数组可以看作是由多个一维数组组合而成,如果一个数组的每个元素又是一个数组,那么这个数组就是二维数组。所以一个二维数组也可以分解为多个一维数组。
注意事项
数组名是数组首元素地址,但有两种情况例外
- sizeof(数组名),计算整个数组大小,sizeof内部单独放一个数组名,数组名表整个数组
- &数组名,取出的是整个数组的地址,数组名表整个数组
例子:冒泡排序
#include <stdio.h>
void Bubble_Sort(int arr[],int sz)
{
int i=0,j=0,flag,tmp;
for(i=0;i<sz-1;i++)
{
flag=0;
for(j=0;j<sz-1-i;j++)
{
if(arr[j]>arr[j+1])
{
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
flag=1;
}
}
if(flag==0)
{
break;
}
}
}
int main()
{
int arr[]={9,8,7,6,5,4,3,2,1};
int i=0;
int sz=sizeof(arr)/sizeof(arr[0]);
Bubble_Sort(arr,sz);
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}