一组类型相同的数据【C 数组】总结

news2024/11/24 12:39:10

作者 :   会敲代码的Steve

   

墓志铭博学笃志  切问静思

前言:本文旨在复习C语言数组章节的知识点、分为以下几个部分:

  1. 什么是数组
  2. 一维数组、一维数组的初始化、一维数组的遍历、冒泡排序。
  3. 二维数组、二维数组的创建和初始化、二维数组的使用
  4. 数组作为函数传参时
  5. 数组越界
  6. C99标准的变长数组

正文: 

目录

1.什么是数组?

 2.一维数组初始化

  2.1 一维数组遍历

2.2 冒泡排序

  2.3 代码

3.二维数组

3.1 二维数组的创建和初始化

3.2 二维数组的遍历

4.数组作为函数元素传参

 5.c99标准的变长数组


1.什么是数组?

   数组是一组相同数据的集合

 2.一维数组初始化

  前面我们学习了如何定义一个变量,其中变量是这么定义的 :

int a;  //int 数据类型  //变量名

 那数组是如何定义的呢? 让我们看下面的代码

int arr[5]={0,1,2,3,4}; //int 数据类型 arr 数组名 //[5]代表里面有五个元素 

所以这是一个包含有5个元素的int类型数组;   

数组的初始化:

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)

但是对于下面的代码要区分,内存中如何分配。 

char arr1[] = "abc";
char arr2[3] = {'a','b','c'};

对于数组的使用我们之前介绍了一个操作符: [] ,下标引用操作符。它其实就数组访问的操作符。 我们来看代码:

# include <stdio.h>
int main (void)
{
	int arr[5]={0,1,2,3,4};//数组的完全初始化
	
}

 总结:

  1. 1.数组是使用下标来访问的,下标是从0开始。
  2.  2. 数组的大小可以通过计算得到。
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);

  2.1 一维数组遍历

数组是可以通过下标的方式来遍历,上面已经介绍过了数组的初始化,我们来尝试一下写写代码。

for(int i = 0;i<5;i++)
	{
		printf("%d ",arr[i]);//依次访问0-4的所有数组元素
	}
	return 0;

于是这就是数组的一个简单的遍历。 

补充:

数组的下标是有范围限制的。 数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。 C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就 是正确的, 所以程序员写代码时,最好自己做越界的检查。

#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\n", arr[i]);//当i等于10的时候,越界访问了
   }
 return 0;
}

二维数组的行和列也可能存在越界。 

2.2 冒泡排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来

说并没有什么太大作用。

1. 算法步骤

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2. 动图演示

  2.3 代码

#include <stdio.h>
int main() {
  int a, b, temp;
  int m[10];
  for (a = 0; a < 10; a++) {
    scanf("%d", &m[a]);
  }
  for (a = 0; a < 9; a++) {

    for (b = a + 1; b < 10; b++) {
      if (m[a] > m[a + 1]) {
        temp = a[m];
        a[m] = a[m + 1];
        a[m + 1] = temp;
      }
    }
  }
  for (a = 0; a < 10; a++) {
    printf("%d ", m[a]);
  }
  return 0;
}

3.二维数组

二维数组只是比一维数组多一个维度,可以理解为矩阵。

3.1 二维数组的创建和初始化

创建:

//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];

 初始化:

int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省略

3.2 二维数组的遍历

define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int main(void)
{
	int arr[3][4] = {	{2, 7, 8, 5}, 
						{75, 8, 9, 8}, 
						{26, 37, 99, 9} };
	for (size_t i = 0; i < 3; i++)		//行
	{
		for (size_t j = 0; j < 4; j++)  //列
		{
			printf("%d ", arr[i][j]*2);
		}
		printf("\n");
	}

4.数组作为函数元素传参

往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序(这里要讲算法 思想)函数 将一个整形数组排序。

错误的冒泡排序:

#include<stdio.h>
void sort(int arr[]);
int main()
{
   int i = 0;
  int rtr[10]={0};
  
   for(i = 0;i<10;i++)
   {
     scanf("%d",&rtr[i]);
   }
   sort(rtr);
   for(i = 0;i<10;i++)
   {
     printf("%d ",rtr[i]);
   }
  return 0;
}
void sort(int arr[])
{
	 int sz = sizeof(arr)/sizeof(arr[0]);
    int i,j = 0;
    for(i = 0;i<sz;i++)
    {
      for(j = 0;j<sz-1-i;j++)
      {
        if(arr[j]>arr[j+1])
        {
          int temp = arr[j];
          arr[j]=arr[j+1];
          temp = arr[j];
        }
      }
    }
}

难道数组作为函数参数的时候,不是把整个数组的传递过去?

正确的冒泡排序: 

#include<stdio.h>
void sort(int arr[],int sz);
int main()
{
   int i = 0;
  int rtr[10]={0};
   int sz = sizeof(rtr)/sizeof(rtr[0]);
   for(i = 0;i<sz;i++)
   {
     scanf("%d",&rtr[i]);
   }
   sort(rtr,sz);
   for(i = 0;i<sz;i++)
   {
     printf("%d ",rtr[i]);
   }
  return 0;
}
void sort(int arr[],int sz)
{
    int i,j = 0;
    for(i = 0;i<sz;i++)
    {
      for(j = 0;j<sz-1-i;j++)
      {
        if(arr[j]>arr[j+1])
        {
          int temp = arr[j];
          arr[j]=arr[j+1];
          temp = arr[j];
        }
      }
    }
}

数组名是什么?

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

 如果数组名是首元素地址,那么:

int arr[10] = {0};
printf("%d\n", sizeof(arr));

为什么输出的结果是:40?

  1. 补充: 1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数 组。
  2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。 除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。 

 5.c99标准的变长数组(补充)

  这样的代码会报错吗?

#include<stdio.h>
int main()
{
    int n = 5;
   int arr[n];
}

答案是在C99标准下,并不会;但如果在msvc里面则使用会提示你要使用变量而不是常量。这就是C99标准。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多功能采集仪VH03接口使用说明

传感器接口 传感器接口须使用设备专门配备的测线&#xff0c;一端为 DB9 一端为用颜色区分的多个鳄鱼夹&#xff0c;线&#xff08;鳄鱼夹&#xff09;颜色和功能定义详见“设备组成和接口定义” 。 充电和通讯接口 VH03 使用标准的 USB Type-C 接口完成设备充电和通讯&…

创建一个vue项目

文章目录前言一、安装node.js二、vue ui命令没有反应原因1.vue ui命令是vue 3.x版本以上才支持&#xff0c;因此需要更新vue的版本。2.更新vue版本2.1首先使用以下命令卸载旧版本2.2然后使用下面命令安装最新版本2.3查看是当前版本号2.4此时&#xff0c;输入 vue -h 命令查看co…

HMS Core 3D流体仿真技术,打造移动端PC级流体动效

移动设备硬件的高速发展&#xff0c;让游戏行业发生翻天覆地的变化&#xff0c;许多酷炫的游戏效果不再局限于电脑端&#xff0c;玩家在移动端就能享受到场景更逼真、画质更清晰、体验更流畅的游戏服务。但由于移动设备算力不足&#xff0c;为了实现真实感的水体效果&#xff0…

cesium地形上面绘点时,山背面点位始终显示在地形上

cesium地形上面绘点时&#xff0c;山背面点位始终显示在地形上&#xff0c;如下图&#xff1a; 深度检测也是打开的&#xff0c;各种方法试完之后&#xff0c;也没有找到问题&#xff0c;把viewer属性注释之后&#xff0c;就没有出现这个问题&#xff0c;于是一个个属性&#…

【LeetCode】C语言实现---用队列实现栈用栈实现队列

目录&#x1f449;用队列实现栈&#x1f449;用栈实现队列&#x1f449;用队列实现栈 入口&#xff1a;OJ 题目描述&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 em…

redis的消息发布订阅实现

文章目录前言一、创建好springboot项目,引入核心依赖二、使用步骤1. 自定义一个消息接受类2.声名一个消息配置类3.编写一个测试类总结前言 一般项目中都会使用redis作为缓存使用,加速用户体验,实现分布式锁等等,redis可以说为项目中的优化,关键技术实现立下了汗马功劳.今天带来…

YonBuilder应用构建教程之移动端基础配置

在YonBuilder中除了PC端应用的构建外&#xff0c;我们还可以构建配套的移动端页面。对于同一个数据实体可以实现PC端和移动端的数据同步修改&#xff0c;使数据录入、修改、审批等更加便捷。本篇文章通过对员工信息实体的移动端页面构建来对YonBuilder移动端配置的基础流程进行…

利用ENVI对遥感图像校正

1.几何校正 引起图像几何变形一般分为两大类:系统性和非系统性。系统性一般由传感器本身引起&#xff0c;有规律可循和可预测性&#xff0c;可以用传感器模型来校正&#xff0c;卫星地面接收站已经完成这项工作;非系统性几何变形是不规律的&#xff0c;它可以是传感器平台本身…

【Axure高保真原型】移动端钱包原型模板

今天和大家分享移动端钱包的原型模板&#xff0c;里面包含了11大模块&#xff0c;各个模块都是高保真高交互的原型模板&#xff0c;大家可以在演示地址里体验哦 【原型预览及下载地址】 https://axhub.im/ax9/4c3757a85d201a4c/#c1 这个原型还可以在手机上演示哦&#xff0c…

Bitmiracle Docotic.Pdf Library 8.8.14015 Crack

C# 和 VB.NET 的 PDF 库 Docotic.Pdf 是用于 .NET 的高性能 C# PDF 库。您可以使用它在 .NET Core、ASP.NET、Windows Forms、WPF、Xamarin、Blazor、Unity 和 HoloLense 应用程序中创建、阅读和编辑 PDF 文档。 该库支持 .NET 6、.NET 5、.NET Standard/.NET Core 和 .NET 4.…

Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()

目录 1--模板匹配 1-1--OpenCV API 1-2--六种匹配方法 1-3--代码实例 2--最值计算 2-1--OpenCV API 1--模板匹配 使用模板图像与原图像进行匹配&#xff0c;OpenCV提供了相应的模板匹配函数cv::matchTemplate()&#xff0c;并支持六种模板匹配方法。 1-1--OpenCV API vo…

【Linux】Linux项目自动化构建工具——make/Makefile

我举报&#xff0c;有人不学习&#xff01;&#xff01;&#xff01; 文章目录一、makefile原理二、初步理解makefile的语法1.gcc如何得知&#xff0c;源文件不需要再编译了呢&#xff1f;2.为什么执行的指令是make和make clean呢&#xff1f;三、makefile的推导规则四、Linux…

2023年1月数据治理认证DAMA-CDGA/CDGP(线上)招生简章

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

C语言刷题系列——17.计算平均成绩 18.找出总分最高的学生19.通讯录排序

结构 - PTA练习题&#x1f424;计算平均成绩&#x1f3c0; 题目要求&#x1f3c0; 题解&#x1f4bb;step1.定义结构体&#x1f4bb;step2.输入N&#xff1b;随后N行 每行给出一位学生的信息&#x1f4bb;step3.求平均值&#x1f4bb;step4.输出平均线以下的学生的信息&#x1…

数据可视化最简单的方式-饼状图,折线图,条形图

一个软件或者网站分为前端&#xff0c;后端。 后端传统意义就是处理后端的数据。 后端又分为数据库编程人员和后端业务逻辑人员。 前端顾名思义解决后端传递的数据。传递的数据如何显示是前端人员考虑的问题。 前端人员不光要设计好网页界面&#xff0c;而且要将数据的可视…

嵌入式:ARM协处理器指令总结

文章目录&#xff08;一&#xff09;协处理器的数据操作二进制编码汇编格式&#xff08;二&#xff09;协处理器的数据存取二进制编码汇编格式&#xff08;三&#xff09;协处理器的寄存器传送二进制编码汇编格式未使用的指令空间ARM支持16个协处理器&#xff0c;用于各种协处理…

java Redis基础 数据类型 常用命令 java中使用Redis

Redis是一个基于内存的key-value结构数据库。 Redis入门 Redis简介 Redis应用场景&#xff1a; Redis 下载与安装 Windows版下载地址&#xff1a;https://github.com/microsoftarchive/redis/releases Linux版下载地址&#xff1a; https://download.redis.io/releases/ Red…

Java 中的main方法原理介绍。

//深入了解main方法 // 解释main方法的形式为什么是这样写的&#xff1f; // public static void main(String[] args) // 问题1&#xff1a;是谁调用main方法&#xff1f; // java虚拟机调用main方法&#xff0c;所以main的访问权限是public // 问题2&#xff1a;为什么是st…

电竞游戏蓝牙耳机哪个牌子好?电竞游戏蓝牙耳机排行榜

喜欢玩游戏或是追剧的话&#xff0c;佩戴蓝牙耳机更加不易受到外界的干扰&#xff0c;传输效果好的蓝牙耳机能够带来更好的画面感和立体感&#xff0c;那么电竞游戏蓝牙耳机哪个牌子好呢&#xff1f;以下是小编整理的几款当前值得入手的游戏蓝牙耳机。 第一款&#xff1a;南卡…

Java多线程之线程安全问题

文章目录一. 线程安全概述1. 什么是线程安全问题2. 一个存在线程安全问题的程序二. 线程不安全的原因和线程加锁1. 案例分析2. 线程加锁2.1 理解加锁2.2 synchronized的使用2.3 再次分析案例3. 线程不安全的原因三. 线程安全的标准类一. 线程安全概述 1. 什么是线程安全问题 …