当前位置:网站首页>012 C语言基础:C数组
012 C语言基础:C数组
2022-06-27 04:04:00 【入狱计划进度50%】
一:概述
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。
数组中的特定元素可以通过索引访问。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。数组中的特定元素可以通过索引访问,第一个索引值为0。
二:声明数组
在C中要声明一个数组,需要指定元素的类型和元素的数量。
type arrayName [arraySize];
这是一维数组,arraySize必须是一个大于零的整数常量,type可以是任意有效的C数据类型。例如,声明一个类型为double的包含10个元素的数组balance:
double balance[10];
现在balance是一个可用的数组,可以容纳10个类型为double的数字。
三:初始化数组
double balance[5] = {
1000.0, 2.0, 3.4, 7.0, 50.0};
大括号{}之间的值的数目不能大于我们在数组声明时[]中指定的元素数目。若是省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:
double balance[] = {
1000.0, 2.0, 3.4, 7.0, 50.0};
创建一个数组,它与前一个实例中所创建的数组是完全相同的。
四:访问数组元素
double salary = balance[9]; 把数组中第10个元素的值赋给变量salary
实例:
#include <stdio.h>
int main(){
int n[10]; // n是一个包含10个整数的数组
int i,j;
// 初始化数组元素
for(i=0; i<10; i++){
n[i] = i + 100;
}
for(j=0; j<10; j++){
printf("element[%d] = %d \n", j, n[j]);
}
return 0;
}
结果:
┌──(rootkali)-[~/Desktop/c_test]
└─# vim fangwenshuzu.c
┌──(rootkali)-[~/Desktop/c_test]
└─# gcc fangwenshuzu.c -o fangwenshuzu
┌──(rootkali)-[~/Desktop/c_test]
└─# ./fangwenshuzu
element[0] = 100
element[1] = 101
element[2] = 102
element[3] = 103
element[4] = 104
element[5] = 105
element[6] = 106
element[7] = 107
element[8] = 108
element[9] = 109
五:多维数组
C语言支持多维数组,形式如下:
type name[size1][size2]...[sizeN];
例如,下面的声明创建一个三维5.10.4整型数组
int threedim[5][10][4];
二位数组
多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:type arrayName [ x ][ y ];
其中,type 可以是任意有效的 C 数据类型,arrayName 是一个有效的 C 标识符。一个二维数组可以被认为是一个带有 x 行和 y 列的表格。
因此,数组中的每个元素是使用形式为a[i][j]的元素名称来标识的,其中a是数组名称,i和j是唯一标识a中每个元素的下标。
初始化二维数组
int a[3][4] = {
{
0, 1, 2, 3}, // 初始化索引号为0的行
{
4, 5, 6, 7}, // 初始化索引号为1的行
{
8, 9, 10, 11} // 初始化索引号为2的行
}
内部嵌套的括号是可选的,下面的初始化与上面是等同的。
int a[3][4] = {
0,1,2,3,4,5,6,7,8,9,10,11};
访问二维数组元素
二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。
int val = a[2][3] 获取数组中第3行第4个元素
实例:
#include <stdio.h>
int main(){
// 一个带有5行2列的数组
int a[5][2] = {
{
0, 0},
{
1, 2},
{
2, 4},
{
3, 6},
{
4, 8}
};
int i, j;
printf("%d \n", a[1][1]); // 1 1 为其索引值
printf("------------- \n");
// 输出数组中每个元素的值
for(i=0; i<5; i++){
for(j=0; j<2; j++){
printf("a[%d][%d] = %d \n", i, j, a[i][j]);
}
}
return 0;
}
结果:
┌──(rootkali)-[~/Desktop/c_test]
└─# vim erweishuzu.c
┌──(rootkali)-[~/Desktop/c_test]
└─# gcc erweishuzu.c -o erweishuzu
┌──(rootkali)-[~/Desktop/c_test]
└─# ./erweishuzu
2
-------------
a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8
六:C传递数组给函数
如果想要在函数中传递一个一维数组作为参数,必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,
因为每种方式都会告诉编译器将要接收一个整型指针。同样地,也可以传递一个多维数组作为形式参数。
方式一:形式参数是一个指针
void myFunction(int *param){
}
方式二:形式参数是一个已定义大小的数组:
void myFunction(int param[10]){
}
方式三:形式参数是一个未定义大小的数组:
void myFunction(int param[]){
}
实例:
现在,让我们来看下面这个函数,它把数组作为参数,同时还传递了另一个参数,根据所传的参数,会返回数组中各元素的平均值:
double getAverage(int arr[], int size){
int i;
double avg;
double sum;
for(i=0; i<size; ++i){
sum += arr[i];
}
avg = sum / size;
return avg;
}
#include <stdio.h>
double getAverage(int arr[], int size); // 函数声明
int main(){
// 带有5个元素的整型数组
int balance[5] = {
1000, 2, 3, 17, 50};
double avg;
// 传递一个指向数组的指针作为参数
avg = getAverage(balance, 5);
// 输出返回值
printf("平均值是: %f", avg);
return 0;
}
结果:
┌──(rootkali)-[~/Desktop/c_test]
└─# vim shuzuhanshu.c
┌──(rootkali)-[~/Desktop/c_test]
└─# gcc shuzuhanshu.c -o shuzuhanshu
┌──(rootkali)-[~/Desktop/c_test]
└─# ./shuzuhanshu
平均值是: 214.400000
边栏推荐
- Kotlin Compose 隐式传参 CompositionLocalProvider
- 手撸promise【二、Promise源码】【代码详细注释/测试案例完整】
- Mobilenet series (4): mobilenetv3 network details
- [BJDCTF2020]The mystery of ip
- 缓存综合项目--秒杀架构
- Promise [II. Promise source code] [detailed code comments / complete test cases]
- 跟着BUU学习Crypto(周更)
- Promise source code class version [III. promise source code] [detailed code comments / complete test cases]
- iOS开发:对于动态库共享缓存(dyld)的了解
- PostgreSQL basic command tutorial: create a new user admin to access PostgreSQL
猜你喜欢

How to make ef core 6 support dateonly type

2021:Passage Retrieval for Outside-KnowledgeVisual Question Answering通道检索的外部知识视觉问答
![Promise [II. Promise source code] [detailed code comments / complete test cases]](/img/ac/abf3181fa7b3345efcc9abc046cea5.png)
Promise [II. Promise source code] [detailed code comments / complete test cases]

Office VR porn, coquettish operation! The father of Microsoft hololens resigns!

2016Analyzing the Behavior of Visual Question Answering Models

敏捷开发篇--Agile Development-自用

使用promise的基本功能【四、Promise源码】

Nacos调用微服务两个问题:1.Load balancer does not contain an instance for the service 2.Connection refused

PostgreSQL basic command tutorial: create a new user admin to access PostgreSQL

Agile development - self use
随机推荐
实践 DevOps 时,可能面临的六大挑战
jmeter将上一个请求的结果作为下一个请求的参数
2020:MUTANT: A Training Paradigm for Out-of-Distribution Generalizationin Visual Question Answering
Static timing analysis OCV and time derive
Usage knowledge of mobile phones in new fields
2021:Passage Retrieval for Outside-KnowledgeVisual Question Answering通道检索的外部知识视觉问答
733. image rendering
Semantic version 2.0.0
高等数学(第七版)同济大学 习题1-10 个人解答
Matlab | visualization of mathematical properties related to three interesting circles
语义化版本 2.0.0
[BJDCTF2020]The mystery of ip
How to systematically learn LabVIEW?
Kotlin compose compositionlocalof and staticcompositionlocalof
List of best reading materials for machine learning in communication
2021:Beyond Question-Based Biases:Assessing Multimodal Shortcut Learning in Visual Question Answeri
苹果手机证书构体知识
从某种意义来讲,互联网业已成为了一个孵化器,一个母体
2021:Check it again:Progressive Visual Question Answering via Visual Entailment通过视觉暗示进行渐进式视觉问答
Human soberness: bottom logic and top cognition