C语言白话之数组

简介: 大家好这里是三岁,C语言是各类语言的基础,由于个人学习需要特别开设了C语言基础专题,内容不一定深入,都是基础知识,还是白话C语言,最简单的方式带领大家学习不是那么容易理解的C语言!

数组



当我们要保存数量比较大的数据时如果就之前所学习的内容需要非常多的变量,使用起来异常麻烦比如要输入一个字符串"hello world"就首先需要知道字符串的长度然后再定义相同长度的变量然后再逐个输入非常麻烦!


那么怎么办呢,这里就引入了一个特殊的类型数组


数组就是一组名字相同,类型相同但是带有不同下标的变量。

数组可以有多个维度,分为一维数组和多维数组


20210504211712940.png


上面只是一个例子,代表着立体的多维数组的样式。


一维数组的定义



当数组的下标只有一个的时候就是一维数组,相当于只有一行。所有的数据都在一行上面。


定义方式

类型说明符 数组名[常量表达式]
type array_name[n]


举例:

int a[10];  //整型长度为10的数组
float b[8];  //浮点型长度为8的数组
char c[15];  //字符型长度为15的数组
char *p[];  //字符型的一维数组指针


其中编号是从0开始的直到n-1结束。共计n个

举例:

int a[10];
里面的值为
a[0] a[1] a[2]… a[9]


要读取数组中的某一个值我们可以直接使用下标进行读取。

如第5个值就可以直接使用a[4]对数据进行读取。

如果读取第10个值就使用a[9]

但是如果使用a[10]不会进行报错但是数据会出现问题(后面会进行试验,这个需要在特殊时期进行设计使用)


一维数组初始化



  • 方法一:


type array_name[]={value}


这种办法无需定义数组的长度,可以直接进行赋值,赋值的长度就是最后数组的实际长度。

举例:

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


#include<stdio.h>
main(){
  int a[]={0,1,2,3,4,5,6,7,8,9};
  printf("%d",sizeof(a)/sizeof(a[0]));
}


20210504214038430.png


说明:


sizeof用于计算占用空间的大小,先使用sizeof计算整个a的大小然后除以一个值占用的大小就是a的长度。

a_length=sizeof(a)/size(a[n])除以任何一个值都一样

a_length=sizeof(a)/size(int) 除以数据类型的大小也一样


  • 方法二:
type array_name[n]={value}


这种办法先定义了数组的长度,然后再进行实例化,可以全部实例化也可以部分实例化

举例:

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


a的长度是10,值是0,1,2,3,4,5,6,7,8,9;

b的长度是10,值是1,2,0,0,0,0,0,0,0,0;

#include<stdio.h>
main(){
  int a[10]={0,1,2,3,4,5,6,7,8,9};  // 定义a
  int b[10]={1,2};  // 定义b
  int a_length=sizeof(a)/sizeof(a[0]);  // 计算a的长度
  int b_length=sizeof(b)/sizeof(b[0]);  // 计算b的长度
  int i=0,j=0;
  printf("a的值:\n");
  for(i;i<a_length;i++){  // 循环得到a的值
    printf("%d ",a[i]);
  } 
  printf("\nb的值:\n");
  for(j;j<b_length;j++){  // 循环得到b的值
    printf("%d ",b[j]);
  } 
}


20210504220407155.png


  • 特殊情况
    char格式的数组,就不一样
    他可以是直接使用字符串进行实例化。
char c[]="hello world";
char d[]={'h','e','l','l','o',' ','w','o','r','l','d'};
#include<stdio.h>
main(){
  char c[]="hello world";
    char d[]={'h','e','l','l','o',' ','w','o','r','l','d'};
    printf("%s\n",c);
  printf("%s\n",d); 
}


20210504225708127.png


说明:虽然结果都是hello world但是c和d数组的长度是不一样的。

之前字符串哪里说过字符串最后一位是’\0’所以c应该比d多一位。


证明:

#include<stdio.h>
main(){
  char c[]="hello world";
    char d[]={'h','e','l','l','o',' ','w','o','r','l','d'};
    printf("%s\n",c);
    printf("c的长度:%d\n",sizeof(c)/sizeof(c[0]));
    printf("最后一位的值为:%s\n",c[11]);
  printf("%s\n",d); 
  printf("d的长度:%d\n",sizeof(d)/sizeof(d[0]));
}


20210504230124917.png


说明:如果没有实例化的数据默认为0.


输出的下标及引用




20210504231759979.png

之前定义的数组c对应的小标值

让我们查看一下第7个值吧


#include<stdio.h>
main(){
  char c[]="hello world";
    char d[]={'h','e','l','l','o',' ','w','o','r','l','d'};
    printf("%c ",c[6]);
}


20210504232223303.png


在对数组引用时也可以使用整数表达式。

例如:

a[1+4];
b[i+2j];  // i,j均为整数。


示例:


把一个数组正序输出和倒叙输出。

思路:

先实例化一个数组并定义

循环输出(通过循环方式不同修改下标)


#include<stdio.h>
main(){
  char c[]="hello world";
  int i,j;
    for(i=0;i<12;i++){
      printf("%c ",c[i]);
  }
  printf("\n");
  for(j=11;j>=0;j--){
    printf("%c ",c[j]);
  }
}


20210504233359771.png


实践:斐波那契数列完成法:



斐波那契是编程届出名的小白题目


20210504234913609.png


斐波那契具体解析查看

我们这里以20为长度进行举例:


#include<stdio.h>
main(){
  int fibonacci[20],i,j;
  fibonacci[0]=0;  // 实例化0
  fibonacci[1]=1;  // 实例化1
  for(i=2;i<20;i++){
    fibonacci[i]=fibonacci[i-2]+fibonacci[i-1];  // 循环计算
  }
  for(j=0;j<20;j++){
    printf("%-6d ",fibonacci[j]);  // 循环输出
    if((j+1)%5==0){
    printf("\n");
    }
  }
}


思路解析:

首先定义一个20长度的数组

对下标为0,1的进行实例化(初始化)

再通过公式对后面的进行计算

接着for循环输出即可。


20210504234759205.png


二维数组



二维数组和一维数组差不多就是多了一个维度,但是维度这种东西很抽象不好 理解,在这里尽量给大家细化。


先看例子把:

#include<stdio.h>
main(){
  int a[2][4]={{1,2,3,4},{5,6,7,8}};  // 定义一个二维数组
  printf("%d\n",a[0][1]);  // 输出下标是0,1的数据
  printf("%d\n",a[1][1]);  // 输出下标是1,1的数据
}


20210507010151325.png

20210507010845835.png


解析:

首先呢看一下两个维度怎么看。

上面二维的数据,怎么看两个[ ][ ]里面写上面呢?

怎么样看一组数据是几维呢?

[ ] [ ]这个要看{}里面的数据先看最里面那个{ }


例:{{1,2,3,4},{5,6,7,8}}

一共有两层嵌套就是二维数据

然后最里面一层的长度最大是4那么最后面的括号就是4

外层大括号里面有2个大括号那么第2层的内容就是2


举例

{{1,2},{3,4,5},{6,7,8,9},{},{}}

这个数据要怎么样定义?

实例化结果是多少?


首先看最里面一层的长度

2,3,4,0,0最长的是4那么第二个中括号就是4

再看外层嵌套了多少个花括号

一共是5个那么第一个中括号里面就是5


int a[5][4]这个是标准的定义,两个值可以大于5,4这个数据,如果小于会出现警告:[Warning] excess elements in array initializer

那么最后我们得到的结果是什么呢?


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


20210507014942764.png


就是我们定义了的地方完成了局部实例化,其他地方使用0进行了补齐。


多维数组



多维数组与上方的方式差不多,就是嵌套了多层的大括号,这个就需要自己去理解了。

举例:


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


20210507022306842.png


目录
相关文章
|
15天前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
56 6
|
19天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
42 5
|
19天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
23天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
23天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
26天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
48 4
|
2月前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
49 6
|
2月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
2月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
2月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。