C语言初阶(4)——数组

目录

1.数组的概念

2.一维数组的创建和初始化

2.1.数组的创建

2.2.数组初始化

3.一维数组的使用

4.一维数组在内存中的存储

5.sizeof计算数组元素个数

6.二维数组的创建和初始化

6.1.二维数组的创建

6.2.二维数组的初始化

 7.二维数组的使用

8.二维数组在内存中的存储

9.C99中的变长数组


1.数组的概念

(1)数组是一组相同类型元素的集合;

(2)数组元素个数不能为0;

(3)数组分为一维数组和多维数组;

2.一维数组的创建和初始化
2.1.数组的创建

(1)基本语法:

type arr_name[常量值];
  |      |
  |      |
类型    数组名
//type:数组中存放数据的类型(char、short、int、float、自定义类型)
//arr_name:数组名,可以自定义
//[]中的常量名:用于指定数组的大小
2.2.数组初始化
//完全初始化
int arr1[5]={1,2,3,4,5};

//不完全初始化
int arr2[5]={1};//第1个元素初始化为1,剩下的元素初始化为0

//错误的初始化——初始化项太多
int arr3[3]={1,2,3,4};

//也可以省略掉数组内的小指定,编译器会根据数组的初始化内容确定数组的真实大小
int arr4[]={1,2,3,4,5};
3.一维数组的使用

(1)数组的下标从0开始,第n个元素的下标为n-1;

(2)[]叫做下标引用操作符,只需要将想要找的元素的下标填入其中即可;

(3)想要访问整个数组的内容,利用循环语句产生所有元素的下标即可;

(4)若想要自己输入数组的数据,则可以采用scanf("%d",&arr[i]);的形式;

4.一维数组在内存中的存储

计算机处理的数据,均要加载到内存中处理,内存会被划分为一个个的内存单元(一个内存单元就相当于一个字节),然后给每个内存单元都编上号:编号==地址

#include <stdio.h>
int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10}; 
    int i = 0;
    for(i=0; i<10; i++)
    {
        printf("&arr[%d] = %p\n ", i, &arr[i]);//%p是用于打印地址的
    }
return 0;
}

由运行结果可知:随着数组下标的增长,地址由小到大变化,并且每两个相邻元素之间相差为4;

(1)一维数组在内存中是连续存放的

(2)随着数组下标的增长,地址是由小到大增长的;

5.sizeof计算数组元素个数

(1)sizeof可以用于计算数组中元素的大小:

printf("%d\n",sizeof(arr));//40——计算的是数组总元素的大小,单位是字节
printf("%d\n",sizeof(arr[0]));//4——计算的是数组首元素的大小,单位为字节

(2)sizeof可以计算出数组中元素的个数:

#include<stdio.h>
int main()
{
    int arr[10]={0};
    int sz=sizeof(arr)/sizeof(arr[0]);//此处结果为10,因为数组中总共有10个元素
//原理:数组元素个数=数组总大小/数组首元素的大小
    printf("%d\n",sz);
    return 0;
}
6.二维数组的创建和初始化

一维数组作为数组的元素时得到的就为二维数组,将二维数组作为数组的元素时得到的就为三维数组,二维数组以上的数组统称为多维数组

6.1.二维数组的创建
type arr_name[常量值1][常量值2]
                |        |
                |        |
                行       列
int arr[3][5];
//3代表数组有3行;
//5代表数组有5列;
//int代表数组的每个元素为整型类型;
//arr为数组名,可自定义
6.2.二维数组的初始化
//不完全初始化
int arr1[3][5]={1,2};//依次初始化每一行,元素不够的时候就将剩余元素全部初始化为0;
int arr2[3][5]={0};//将所有元素初始化为0;

//完全初始化
int arr3[3][5]={1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};

//按照行初始化
int arr4[3][5]={{1,2}{3,4},{5,6}};
                  |    |     |
                  |    |     |
               第一行 第二行 第三行

//初始化可以省略行,不能省略列
int arr5[][5]={1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2}, {3,4}, {5,6}};

 

 7.二维数组的使用

(1)二维数组的行和列下标都是从0开始的,只要确定了一个元素行和列的下标就能锁定住该元素;

(2)二维数组的输入和输出:

#include <stdio.h>
int main()
{
    int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
    int i = 0;//遍历⾏
//输⼊
    for(i=0; i<3; i++) //产⽣⾏号
    {
        int j = 0;
        for(j=0; j<5; j++) //产⽣列号
        {
            scanf("%d", &arr[i][j]); //输⼊数据
        }
    }
//输出
    for(i=0; i<3; i++) //产⽣⾏号
    {
        int j = 0;
        for(j=0; j<5; j++) //产⽣列号
        {
            printf("%d ", arr[i][j]); //输出数据
//printf放此处表示:一次性全部放进去再打印
        }
    printf("\n");
    }
return 0;
}

#include <stdio.h>
int main()
{
    int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
    int i = 0;//遍历⾏
//输⼊
    for(i=0; i<3; i++) //产⽣⾏号
    {
        int j = 0;
        for(j=0; j<5; j++) //产⽣列号
        {
            scanf("%d", &arr[i][j]); //输⼊数据
            printf("%d ", arr[i][j])
//printf放此次表示:输入一个则打印一个
        }
    }
//输出
    for(i=0; i<3; i++) //产⽣⾏号
    {
        int j = 0;
        for(j=0; j<5; j++) //产⽣列号
        {
            ;
        }
    printf("\n");
    }
return 0;
}
8.二维数组在内存中的存储
#include <stdio.h>
int main()
{
     int arr[3][5] = { 0 };
     int i = 0;
     int j = 0;
     for (i = 0; i < 3; i++)
     {
         for (j = 0; j < 5; j++)
         {
             printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
         }
     }
return 0;
}
 

由运行结果可知:

(1)二维数组中的每个元素是连续存放的;

(2)二维数组是一个存放一维数组的数组,二维数组的每个元素都为一维数组;

9.C99中的变长数组

(1)变长数组不能初始化

(2) gcc编译器支持变长数组;

练习:

//多个字符从两端移动,向中间汇聚
#include<string.h>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
	char arr1[] = "welcome to my world!";
	char arr2[] = "####################";
	int left = 0;
	//int right = strlen(arr1)-1;//下标=长度-1
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	int right = sz - 2;//减去1个\0;减去1个数为下标
	
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);//睡眠1000毫秒,可以减缓程序运行的速度
		system("cls");//system函数为库函数,执行系统命令;cls清理控制台屏幕信息
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

//折半查找(二分查找)
//一次折半过程:
//1.确定被查找的范围;
//2.确定被查找范围的左右下标;
//3.根据左右下标确定中间元素的下标;
//4.1>找到了,就结束;
//4.2>没找到,根据大小关系确定新的折半范围
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//有序的情况下才可使用折半查找
	int k = 0;
	scanf("%d",&k);
	

	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int flag = 0;
	int mid = (left + right) / 2;

	while (left <= right)
	{
		if (arr[mid] == k)
		{
			printf("找到了,下标是:%d\n", mid);
			flag = 1;
			break;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
		if (left > right)
		{
			printf("找不到\n");
		}
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值