首页 > 其他分享 >5.C语言数组(上)

5.C语言数组(上)

时间:2024-11-20 23:16:30浏览次数:3  
标签:10 arr 初始化 int C语言 二维 数组

文章目录


一、数组的概念

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

  • 数组中存放的是一个或者多个数据,但是数组的元素个数不能为0
  • 数组中存放的多个数据,类型是相同的

数组分为一维数组多维数组,其中多维数组一般比较常见的是二维数组。


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

2.1 数组的创建

一维数组创建的基本语法如下:

type arr_name[常量值]

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小数组的元素类型。

  • type 指定的是数组中存放的数据类型,(char、short、int、float等),也可以自定义的类型。
  • arr_name指的是数组名的名字,起的有意义就行
  • [ ]中的常量值是用来指定数组的大小的。

比如:我们现在想存储某个班级的20人的数学成绩,那我们就可以创建一个数组,如下:

int math[20];

2.2 数组的初始化

有时候,我们在创建数组的时候,需要给定一些初始值,这种就称为初始化的。

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

//不完全初始化
int arr[6] = {1};//第一个元素初始化为1,剩余的元素默认初始化为0;

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

2.3 数组的类型

数组也是有类型的,数组算是一种自定义类型,去掉数组名name留下的就是数组的类型。

int arr1[10];  //数组类型 int [10]
int arr2[12];  //数组类型 int [12]

char ch[5];   //数组类型char [5]

三、一维数组的使用

学习了一维数组的基本语法,一维数组可以存放数据,存放数据的目的是对数据的操作。

3.1 数组下标

C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号,如下:

int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//             0 1 2 3 4 5 6 7 8 9

在这里插入图片描述
在c语言数组的访问提供了一个操作符[ ],这个操作符叫:下标引用操作符

#include<stdio.h>
int main()
{
  int arr[10] = {1,2,3,4,5,6,7,8,9,10};
  printf("%d\n",arr[5]);  // 输出结果为6
  printf("%d\n",arr[8]);  // 输出结果为9
  return 0; 

3.2 数组元素的打印

如果想要访问整个数组的内容,那怎么办?
具体思路:1、for循环产生0~9的下标。2、接下来使用下标访问就行了。

#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("%d ",arr[i]);
  }
  return 0;

输出结果:
在这里插入图片描述

3.3 数组的输入

#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++)
  {
    scanf("%d",&arr[i]);
  }
  for(i = 0;i < 10;i++)
  {
    printf("%d ",arr[i]);
  }
  return 0;

运行结果如下:
在这里插入图片描述


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

通过前面的学习,数组的概念,创建,初始化,输入,输出,下标,打印基本没有什么障碍了。
下面我们将了解一下数组在内存中的存储。
依次打印数组元素的地址:

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

输出结果如下:
在这里插入图片描述
我们发现,随着数组下标的增长,地址由小到大变化的,并且每两个相邻的元素之间相差4(因为一个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的


五、sizeof 计算数组元素的个数

sizeof 中c语言是一个关键字,是可以计算类型或者变量大小的,其实sizeof也可以计算数组的大小。

#include<stdio.h>
 int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", sizeof(arr));  //计算数组所占内存空间的总大小,单位是字节。
	printf("%d\n", sizeof(arr[0]));  //计算一个字节长度4
	printf("%d\n", sizeof(arr)/sizeof(arr[0]));  //计算数组的元素个数
	return 0;
}

输出结果依次为:40;4;10;


六、二维数组的创建

6.1 二维数组的概念

前面学习的数组被称为一维数组,数组的元素都是内置类型。如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组
在这里插入图片描述

6.2 二维数组的创建

语法如下:

type arr_name[常量值1][常量值2];
例如:
int arr[3][5];
double date[2][8];

解释:上述代码中出现的信息

  • 3表示数组有3行
  • 5表示数组有5列
  • int 表示数组的每个元素都是整型类型
  • arr 是数组名,可以根据自己需求设定
    date 数据意思基本一致

七、二维数组的初始化

7.1 不完全初始化

int arr1[3][5] = {1,2};
int arr2[3][5] = {0};

在这里插入图片描述

7.2 完全初始化

int arr1[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

在这里插入图片描述

7.3 按照行初始化

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

在这里插入图片描述

7.4 初始化时省略行,但是不能省略列

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}};

在这里插入图片描述


八、二维数组的使用

8.1 二维数组的下标

当我们掌握了二维数组的创建和初始化,接下来我们如何进行应用呢?
其实二维数组访问也是使用下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯一锁定数组中的一个元素。
C语言规定,二维数组的行是从0开始,列也是从0开始的,如下所示:

int arr1[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

在这里插入图片描述
最右侧的绿色数字是行号,第一行蓝色的数字表示列号,都是从0开始,下面我们开始进行定位:

#include<stdio.h>
int main()
{
  int arr1[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
  printf("%d\n",arr[2][4]);
  return 0;
}
//输出结果为:7

8.2 二维数组的输入和输出

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++)//产生行号
	{
		for (j = 0; j < 5; j++)//产生列号
		{
			scanf("%d",&arr[i][j]);//输入数据
		}
	}
	//输出
	for (i = 0; i < 3; i++)//产生行号
	{
		for (j = 0; j < 5; j++)//产生列号
		{
			printf("%d ", arr[i][j]);//输出数据
		}
		printf("\n");
	}
	return 0;
}

输入和输出的结果:
在这里插入图片描述


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

#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;
}

输出的结果:
在这里插入图片描述
从输出的结果来看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素之间也相差4个字节,所以二维数组中的每个元素都是连续存放的
在这里插入图片描述
了解清楚二维数组在内存中的布局,有利于我们后期使用指针来访问数组的学习。


十、C99中的变长数组

在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式、或者如果我们初始化数据的话,可以省略数组大小。

int arr1[10];
int arr2[3+5];
int arr3[] = {1,2,3};

由此我们引入一个变长数组的新特性,允许我们可以使用变量指定数组大小。
请看下面的代码:

int n = a+b;
int arr[n];

上面示例中,数组arr就是变长数组,因为它的长度取决与变量n的值,编译器没法事先确定,只能运行时才能知道n是多少。

  • 变长数组就是数组大小是变量的数组
  • 数组的大小可以使用变量来指定

遗憾的是vs2022不支持C99中的变长数组的
gcc编译器是支持的

#include<stdio.h>
int main()
{
 int n = 10;
 int arr[n];
 //输入
 int i = 0;
 for(i = 0;i<n;i++)
 {
   scanf("%d",&arr[i]);
 }
 //输出
 for(i = 0;i<n;i++)
 {
   printf("%d ",arr[i]);
 }
  return 0;
}

在这里插入图片描述


2024/11/20 星期三
完结

标签:10,arr,初始化,int,C语言,二维,数组
From: https://blog.csdn.net/weixin_64957584/article/details/143924191

相关文章

  • C语言编程常见问题总结
    1、返回值处理①被调函数执行结果对业务有影响,调用者没有处理返回值:可能导致空指针访问、缺少回退处理(资源泄露)②处理函数的返回值不准确:返回值数据类型被错误转换,返回值比较的目标不是函数的返回值系列 2、断言的使用①在断言中包含了非逻辑表达式②对程序运行中可能发......
  • 2个月搞定计算机二级C语言——真题(12)解析
    1.前言本篇我们讲解2个月搞定计算机二级C语言——真题122.程序填空题2.1题目要求2.2提供的代码#include<stdio.h>#defineN3intfun(int(*a)[N]){inti,j,m1,m2,row,colum;m1=m2=0;for(i=0;i<N;i++){j=N......
  • C语言:数组的学习
    1.什么是数组?数组是一组相同类型元素的集合。数组可以存储1个或多个数据。数组中存储的数据的类型是相同的。数组分为一维数组和多维数组。变量和数组都是容器,变量只能存储一个数据,数组可以存储多个。2.一维数组创建和初始化存放在数组中的数据叫做数组的元素。数组是自......
  • 简单的在数组的特定位置插入数字
    特别简单啊就是要判断好循环次数,实在判断不出来就一个一个数呗然后就是要想到比较完大小,接着输出应该往后延续一个,不然就重叠了#include<stdio.h>intmain(){inta[10];//先定义数组数组有9个元素inti,num,j;//定义各种变量备用//读取数组,其实我......
  • C语言第14节:字符函数和字符串函数
    1.字符分类函数C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。这些函数的使用都需要包含一个头文件是<ctype.h><ctype.h>头文件中的字符分类函数提供了一组用于检查单个字符特性的函数。这些函数接收一个字符(通常为int类型的char值),返回......
  • 经典C语言代码——part 4(素数问题)
    【程序10】题目:打印楼梯,同时在楼梯上方打印两个笑脸。 1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。2.程序源代码:#include"stdio.h"main(){inti,j;printf("\1\1\n");/*输出两个笑脸*/for(i=1;i<11;i++){for(j=1;j<=i;j++)printf......
  • Java小练(数组)
    题目要求:给你一个整数数组“arr”,请你判断数组中是否存在连续三个都是奇数的情况:如果存在请返回“true”;否则返回“false”1.导入要用到的scanner库importjava.util.Scanner;2.获取输入的数据importjava.util.Scanner;publicstaticText_11_19_3{publicstati......
  • 轮转数组
    轮转数组题目给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。示例示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]示例......
  • Scala之Array数组
     可修改的Arrayimportscala.collection.mutable.ArrayBuffer//Array:数组//可修改的:ArrayBuffer//不可修改的:ArrayobjectTest1{//可修改的:ArrayBufferdefmain(args:Array[String]):Unit={//1.新建valarr1=ArrayBuffer(1,2,3)//2.添加......
  • C语言指针学习
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、指针变量是什么?二、p的类型及使用三、函数里定义的数组名是符号量四、指针函数五、函数指针六、指针数组七、数组指针前言提示:这里可以添加本文要记录的大概内容:C语言指针学习提......