学长教你学C-day10-C语言数组

news2024/11/17 21:45:41

  “同学们,我们前面讲过了变量和数据类型,我们来复习一下,用C语言变量存储数据1~10,然后再输出。小明小红你们上黑板来写,其他人写纸上就可以。”

  小明和小红走向讲台拿起粉笔写下:

  小红:

#include<stdio.h>
int main()
{
	int a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10;
	printf("%-2d%-2d%-2d%-2d%-2d%-2d%-2d%-2d%-2d%-2d",a,b,c,d,e,f,g,h,i,j);
	return 0;	
} 

小明:

#include<stdio.h>
int main()
{
	int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;
	a0 = 1;a1 = 2;a2 = 3;a3 = 4;a4 = 5;
	a5 = 6;a6 = 7;a7 = 8;a8 = 9;a9 = 10;
	printf("%-2d%-2d%-2d%-2d%-2d%-2d%-2d%-2d%-2d%-2d",a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
	return 0;	
} 

  “好,写完可以回到座位了。”小明和小红放好粉笔,走回了座位。
  “大家基本上都写好了,我刚看了一圈,写的都大同小异,和黑板上两位同学的都很类似。首先,这样写没有问题,符合C语言语法规范,也符合需求。下面我们来分析一下两位同学的代码。”
  “先来看小红写的,小红同学是用a~j10个英文字母作为整型变量名分别存储的10个数字;小明同学则是用a1-a10来分别存储的10个数字。首先,从变量的定义角度讲都没有问题,但是很明显,我们存储的是一串连续的变量,但是变量在内存中的声明可能并不是连续的,也就是说,我们的变量在定义时,内存空间是随机获取的,那么有没有一种方式,能在内存中获取一串连续递增的地址空间来存储一些变量,方便我们循环遍历呢?答案是肯定的,聪明的C语言开发者们创建了数组存储格式。就是在内存中申请一连续递增的空间来存储变量的。”

定义数组:
语法:datatype 变量名[长度]
代码:

#include<stdio.h>
int main(){
	int a[3]={1,2,3};
	printf("%d\n%d\n%d\n",&a[0],&a[1],&a[2]);
	return 0;
} 
#include<stdio.h>
int main(){
	int a[3];
	a[0]=1;
	a[1]=2;
	a[2]=3;
	printf("%d\n%d\n%d\n",&a[0],&a[1],&a[2]);
	return 0;
} 

  “上面的示例就是整型数组a的定义与赋值,我们向内存空间申请了三个int类型的连续空间,并通过两种不同的赋值语句给数组空间的变量进行了赋值,那么我们来验证一下,输出数组各元素的地址,观察他们是否为连续的空间:”

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

  “从输出的十进制的地址可以看出,数组元素a[0]、a[1]、a[2]的地址空间是连续的,并且每次地址增加4,因为我们申请的数组类型是int类型的,前面我们讲过,一个int类型变量会占4个字节,所以连续的地址号会相差4。”

  “那么,除了int类型外,我们还可以定义其他类型,比如float、char等。这里便不一一举例了,下面我结合地址和循环让大家更加深入的了解数组。”
  “其实,数组就是多个相同类型的变量集合。”
  “数组的地址通常是数组首元素的地址。我们可以定义一个指针变量查看数组。”

#include<stdio.h>
int main(){
	int a[5]={1,2,3,4,5};
	int *p=a;
	printf("%d",*p);
	return 0;
} 

在这里插入图片描述
  上述代码中的,指针变量*p指向数组a或者说是数组a的首地址,然后输出指针变量的值,那么固然等于数组中的下标为0的元素1,也就是说我们可以通过指针变量向指向单一变量一样指向数组。

  那么既然如此,我将int型的指针指向数组的首个元素,然后依次向后移动n次,就可以对数组完成一次遍历。

#include<stdio.h>
int main(){
	int a[5]={1,2,3,4,5};
	int *p=a;
	for(int i=0;i<5;i++){
		printf("%d,",*p+i);
	}
	return 0;
} 

在这里插入图片描述

  除了这种遍历方法外,我们更常用的是数组下标的遍历:

#include<stdio.h>
int main(){
	int a[5]={1,2,3,4,5};
	for(int i=0;i<5;i++){
		printf("%d,",a[i]);
	}
	return 0;
} 

在这里插入图片描述
  同样,我们也可以用指针或者数组下标的方式完成对数组内容的修改。

#include<stdio.h>
int main(){
	int a[5]={1,2,3,4,5};
	int *p=a;
	*p=2;
	a[1]=3;
	for(int i=0;i<5;i++){
		printf("%d,",a[i]);
	}
	return 0;
} 

在这里插入图片描述
  “数组除了除了定义数字还可以定义字符串,下面我们来说说字符串数组。”
  “我们知道,数组赋值有很多方式:”

// 对单个元素赋值
int a[3];
a[0] = 3;
a[1] = 100;
a[2] = 34;
// 整体赋值(不指明数组长度)
float b[] = { 23.3, 100.00, 10, 0.34 };
// 整体赋值(指明数组长度)
int m[10] = { 100, 30, 234 };
// 字符数组赋值
char str1[] = "http:csnd.codeknight.cn";
// 将数组所有元素都初始化为0
int arr[10] = {0};
char str2[20] = {0};

  “赋值虽然是个很简单的事情,但是有一点我们需要注意,就是通常情况下,我们初始定义的数组长度要大于实际赋值的元素的长度,因为在数组定义时,系统会默认给我们的数组后面添加一个结束符‘\0’,也就是cpu判断数组尾部的标志,当遇到这个符号时,就证明这是数组的结尾了。但是这个符号我们是看不见的,也不需要我们看见,只要我们程序员知道有它的存在即可,就向scanf()在缓冲区有’\n’做结束标志位是一样的,'\0’也是数组的结束标志位。所以通常我们定义数组时会比实际大一个数,也就是为了存放标志位。但是,我们现在通用大部分系统或编译器都会自动给我们补充这个位。”

将’\0’作为循环判断数组结束的条件

#include<stdio.h>
#include<string.h>
int main(){
	//char s[]="hello";
	char ss[5]={'h','e','l','l','o'};
	int i=0;while(ss[i]!='\0'){
		printf("%c",ss[i]);
		i++;
	} 
	return 0;
} 

在这里插入图片描述
  “数组有结束,也有开始,如果定义一个数组长度为n,那么有效范围只有a[0]~a[n-1],若是超出这个范围,就称为数组越界。超出下界为“下溢”,超出上界为“上溢”。”

  “最后,我们来聊一聊多维数组。”
  “像我们以上例子所讲的都是属于一维数组,就像是一条x数轴,上面不同的点表示不同的值。或者说是没有首位相连的一条珍珠项链,每个珍珠都是数组中连续挨着的数组元素。但是,除了这些一维数组外,数组还有二维、三维、……n维数组,根据不同的维度可以存储更多的数据。”

#include<stdio.h>
const int N=10;
int main(){
	int a[N][N]={
		{1,2,3},
		{4,5,6},
		{7,8,9}
	};
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;   
} 

在这里插入图片描述

#include<stdio.h>
const int N=10;
int main(){
	int a[N][N][N]={
		{
			{1,2,3},
			{1,2,3},
			{1,2,3},
		}, 
		{
			{4,5,6},
			{4,5,6},
			{4,5,6},
		}, 
		{
			{7,8,9},
			{7,8,9},
			{7,8,9},
		}, 
		
	};
	for(int k=0;k<3;k++){
		for(int i=0;i<3;i++){
			for(int j=0;j<3;j++){
				printf("%d ",a[k][i][j]);
			}
			printf("\n");
		}	
	}
	return 0;   
} 

在这里插入图片描述
  “以上便是二维、三维数组的例子,想要了解更多的同学,课下就要多钻研,多实践。”

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

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

相关文章

VS操作笔记1:添加项目与查看定义

1 在解决方案中添加项目 右击解决方案 点击“添加”——“新建项目”—— 创建新项目的方法与创建第一个时一样 创建之后&#xff0c;项目结构如下&#xff1a; 现在是两个项目&#xff0c;第一个c_test项目名称字体明显加粗&#xff0c;说明这是主项目&#xff0c;编译的时…

【Go基础】切片

切片 1. 切片的定义 切片&#xff08;slice&#xff09;是Golang中独有的数据类型。 数组有特定的用处&#xff0c;但是有不足之处 &#xff1a;运行时长度不可变。切片是随处可变的&#xff0c;它构建在数组之上&#xff0c;并且提供更强大的能力和便捷。 切片&#xff08…

vite构建vue项目目录简介

文章目录1.项目目录介绍2.开发插件安装3.vue组件中的语法规范(SFC 语法规范)4.npm run dev命令执行过程1.项目目录介绍 public 下面的不会被编译 可以存放静态资源assets 下面可以存放可编译的静态资源components 下面用来存放我们的组件App.vue 是全局组件main ts 全局的ts文…

react基础Day01-React概述脚手架搭建JSX组件

React基础知识点 目标 能够说出React是什么能够说出React的特点能够掌握React的基本使用能够使用React脚手架 什么是React &#xff08;★★★&#xff09; React是一个用于构建用户界面的javaScript库&#xff0c;起源于facebook的内部项目&#xff0c;后续在13年开源了出…

Mysql入门技能树-时间日期函数(二)-练习篇

EXTRACT 关于 Extract 操作和其它日期时间函数的对应关系&#xff0c;下列说法正确的是&#xff1a; 1.extract(mirosecond from date) 相当于 ms(date) 2.extract(second from date) 相当于 second(date) 3.extract(minute from date) 相当于 minute(date) 4.extract(hour f…

IO流(二)

1.对象流-ObjectInputStream和ObjectOutputStream&#xff08;处理流包装流&#xff09;的基本原理 看一个需求&#xff1a; 1.将int num100这个int数据保存到文件中&#xff0c;注意不是100数字&#xff0c;而是int 100,并且&#xff0c;能够从文件中直接恢复int 100 2.将Dog …

Excel工具类实现——基于poi5.2.3

初衷仅是因为网上的Excel工具类不是太老旧的方法&#xff0c;就是不是很满足我想法&#xff0c;就想要自己搞一个&#xff0c;不过还不支持合并单元格等复杂的操作&#xff0c;后续看看能不能优化&#xff0c;有大神有更好的方法&#xff0c;可以公众号联系我&#xff0c;让我学…

基于jsp+mysql+Spring的SpringBoot美容院预约管理系统设计和实现

基于jspmysqlSpring的SpringBoot美容院预约管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文…

编制万年历的历程

初入编程之道的学子大都试编过万年历。万年历有二种&#xff1a;一为只有西历的月历&#xff0c;另一为有农历对照的月历或日历。编写万年历程序可以练练手&#xff0c;加深对编程语言的理解。记得我初入此道是在1994年&#xff0c;我那时刚买了486电脑&#xff0c;也刚开始有视…

概率论基本概念

全概率公式 P(B)P(BA1)P(BA2)...P(BAn) P(B) P(B|A1)P(A1) P(B|A2)P(A2) ... P(B|An)P(An)P(BA1)P(BA2)...P(BAn) 事件A1&#xff0c;A2&#xff0c;…构成一个完备事件组且都有正概率 某一个事件概率 这个事件*其他完备事件划分联合概率之和 联合概率 联合概率指的…

线程安全问题(2)

锁的相关知识&#xff1a; 1)这就是类似于说我们ATM机上面有一把锁&#xff0c;同一时刻&#xff0c;如果说人们之间不相互认识&#xff0c;那么通过这把锁就进行限制了说就限制了说一次只能有一个人来进来取钱&#xff0c;我们通过这样的锁&#xff0c;就可以来进行避免上述这…

ESP8266 Arduino开发 搭建web服务器与客户端开发

一、wifi 相关配置 1.1 无线终端 wifi 模式 此模式中&#xff0c;esp8266 会连接到指定 wifi 进行工作。 #include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi库const char* ssid "home"; // 连接WiFi名&#xff08;此处使用home为示例&…

位运算相关

1.与运算 &#xff08;点我&#xff09; 这个题的大概意思&#xff1a;给222个数nnn和xxx&#xff0c;其中满足n&(n1)&(n2)&(n3)...&mxn\&(n1)\&(n2)\&(n3)...\&mxn&(n1)&(n2)&(n3)...&mx,求最小的mmm&#xff0c;只要满足m&g…

【异常】java11提示: Cannot find any provider supporting RSA/ECB/PKCS1Padding的问题

一、背景 项目中需要对敏感字段进行加密&#xff0c;但是加密方法中涉及到比较复杂的加密算法&#xff0c;这些算法都需要一个Provider&#xff0c;主要是用于初始化算法的。 以下是遇到的具体问题 二、报错截图 java.security.NoSuchAlgorithmException: Cannot find any pr…

【软件测试】软件测试模型

1. V模型 需求分析—计划—设计—编码—测试 ● 概要设计&#xff1a;设计整体架构&#xff0c;框架 ● 详细设计&#xff1a;模块和模块之间的详细设计 ● 集成测试&#xff0c;单元测试&#xff1a;通常由开发人员进行 特点&#xff1a; 明确标注了测试的多类型明确标注了测…

Introduction to Multi-Armed Bandits——01 Scope and Motivation

Introduction to Multi-Armed Bandits——01 Scope and Motivation 参考资料 Slivkins A. Introduction to multi-armed bandits[J]. Foundations and Trends in Machine Learning, 2019, 12(1-2): 1-286.项目地址 https://github.com/yijunquan-afk/bandit-learning Bandit…

LeetCode622.设计循环队列

设计循环队列1.题目描述2.思路3.代码实现以及分析3.1 创建结构体3.2创建一个具体的循环队列3.3判断是否为空 和 判断是否为满4. 进队列 和 出队列5.取队首和队尾元素6.释放空间7.总结1.题目描述 设计循环队列 2.思路 环形队列的抽象图 我们这里使用数组模拟实现循环队列&…

TransactionTemplate自动注入,只看这一篇文章就够了

标准的springboot接入mybatis步骤 1.引入了对应的依赖包 2.应用的properties下增加相应配置 3.根据配置进行自动装配 一般我们会配置这些信息&#xff0c;主要包括三类 1.数据库的连接信息 2.指定的数据源类型 3.mybatis的配置信息 配完以后&#xff0c;当你启动SpringBoot的主…

你是真的“C”——详解C语言数组模块知识

详解C语言数组模块知识&#x1f60e;前言&#x1f64c;一维数组的创建和初始化&#x1f64c;1.1 数组的创建&#x1f49e;1.2 数组的初始化&#x1f49e;1.3 一维数组的使用&#x1f49e;1.4 一维数组在内存中的存储&#x1f49e;二维数组的创建和初始化&#x1f64c;1.1 二维数…

【Python百日进阶-数据分析】Day225 - plotly的Ohlc图go.Ohlc()

文章目录一、语法二、参数三、返回值四、实例4.1 简单的OHLC图4.2 隐藏滑块的OHLC图4.3 添加自定义文本和注释4.4 自定义OHLC颜色4.5 带日期时间对象的简单的OHLC图4.6 自定义悬浮文本4.7 Dash中的应用一、语法 ohlc&#xff08;Open-High-Low-Close 的缩写&#xff09;是一种…