C语言:数组

个人博客网址: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
可以看出二维数组每个元素的地址在内存中也是连续的
*/
//二维数组可以看作是由多个一维数组组合而成,如果一个数组的每个元素又是一个数组,那么这个数组就是二维数组。所以一个二维数组也可以分解为多个一维数组。

注意事项

数组名是数组首元素地址,但有两种情况例外

  1. sizeof(数组名),计算整个数组大小,sizeof内部单独放一个数组名,数组名表整个数组
  2. &数组名,取出的是整个数组的地址,数组名表整个数组

例子:冒泡排序

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值