✨博文作者:烟雨孤舟
💖 喜欢的可以 点赞 收藏 关注哦~~✍️ 作者简介: 一个热爱大数据的学习者
✍️ 笔记简介:作为大数据爱好者,以下是个人总结的学习笔记,如有错误,请多多指教!
目录
简介
数组声明
数组初始化
访问数组元素
多维数组
二维数组
字符数组
传递数组给函数
从函数返回数组
指向数组的指针
简介
C 语言数组数据结构,是一个可以存储固定大小的相同类型元素的顺序集合。数组中的特定元素可以通过索引访问,第一个索引值为 0。数组遵循先定义后使用。
数组声明
声明一个数组,需要指定元素的类型和元素的数量
//数组类型 数组名 [数组大小]; 数组大小不必填,初始化时等于元素个数综合
一维数组:type arrayName [arraySize];
二维数组:type arrayName [arraySize][arraySize];
数组名表示该数组所分配连续内存空间中的第一个单元的地址,即首地址,由于数组空间分配之后就不允许改变,因此数组名是一个地址常量,不允许修改
例如:
double balance[10];
//balance是一个实型的数组,可以容纳10个类型为double的数字。
数组初始化
类型名 数组名 [数组长度] ={初始值表}
数组逐个初始化:
int a[3]; a[0]=1;a[1]=2;a[2]=4;
数组整体初始化语句:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
先定义数组再赋值:
int a[2]; a[0]=1;a[1]=2;
数组元素的值通过键盘输入,元素较多可通过循环输入:
inta[1];
scanf("%d",&a[0]);
{ } 之间的数目不能大于在数组声明时[ ] 中指定的元素数目。
如果初始化时省略掉了数组的大小,数组的大小则为初始化时元素的个数。
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
所有的数组都是以0作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去1。
对于数组的初始化需要注意以下几点:
1.可以只给部分元素赋值,当{}中值的个数少于元素个数时,只给前面部分元素赋值,后面的元素自动初始化, 对于short、int、long,就是整数0,对于char就是字符 '\0';对于 float、double,就是小数 0.0。
2.只能给元素逐个赋值,不能给数组整体赋值
int a[2]={1,1}是正确的;int a[2]=1是错误的
访问数组元素
数组元素可以通过数组名称加索引进行访问。索引是放在方括号内的。
访问数组元素格式:
数组名[常量表达式];
double salary = balance[9];
访问数组时,如果[]里有常量计算表达式是对的,[]允许常量表达式。
定义数组后访问数组只能引用单个的数组元素,不能一次性引用整个数组。
数组下标从0开始,下标不能越界,取值单位[0,数组长度-1]。
实例:
#include <stdio.h>
int main ()
{
int n[10]; /* n 是一个包含10个整数的数组 */
/* 通过for循环初始化数组元素 */
for (int i = 0; i < 10; i++ ){
n[i] = i + 100; /* 设置元素 i 为 i + 100 */
}
/* 输出数组中每个元素的值 */
for (int j = 0; j < 10; j++ ){
printf("Element[%d] = %d\n", j, n[j] );
}
return 0;
}
//数组所占存储空间的内存:sizeof(数组名);
//数组的大小:sizeof(数组名)/sizeof(数组下标元素);
#include<stdio.h>
int main(){
int a[]={1,2,3,4,5};
int b;
b=sizeof(a)/sizeof(a[0]);
printf("数组元素个数为:%d",b);
return 0;
}
//在我们没有明确数组的元素个数时,在程序中想知道数组单元个数可以使用 sizeof(a)/sizeof(a[0]), sizeof(a)是得到数组的名称,sizeof(a[0])是得到数组a中单个元素的大小
多维数组
多维数组最简单的形式是二维数组。
多维数组声明的一般形式:
类型 数组名[数组大小][数组大小][数组大小]
type name[size1][size2]...[sizeN];
int threedim[5][10][4];//三维数组5 10 4整形数组
二维数组
二维数组在逻辑上是方阵,由行和列组成。在物理上是线性的,按行来依次进行存放,内存是连续的。
二维数组在本质上是一个声明一个x行y列的二维整型数组,形式如下:
类型名 数组名 [行长度][列长度]
类型 数组名[常量表达式x][常量表达式y];
type arrayName [ x ][ y ];
int x[3][4];//3行4列的二维数组
type可以是任意有效的数据类型,arrayName是一个有效的标识符。一个二维数组可以被认为是一个带有 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, 1, 7} /* 初始化索引号为 2 的行 */
};
按行连续赋值初始化二维数组://所有元素存在的情况下
int a[3][4] = { 0,1, 2, 3,4,5, 6, 7,8, 9, 1, 7} ;
//所有元素存在的情况下,二维数组在初始化时行可以省略不写,列必须要写
int a[][4] = { 0, 1, 2, 3,4,5, 6, 7,8, 9, 1, 7} ;
在定义数组后赋值:
可以定义整个数组后逐个赋值也可以用通过循环嵌套的形式键盘输入
访问二维数组元素:
二维数组中的元素是通过使用下标(数组的行索引和列索引)来进行索引
案例:
#include <stdio.h>
int main ()
{
/* 一个带有 5 行 2 列的数组 */
int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
int i= a[0][2];
printf("%d",i);
return 0;
}
读取二维数组的所有数据:(for 循环)
int a[3][3]={{1,1,2},{1,1,2},{1,1,2}}
for(int i =0;i<=2;i++){
for(int j=0;j<=2;j++){
printf("%d",a[i][j]);
}
}
初始化二维数组的所有元素:(for 循环)
int a[3][3];
for(int i =0;i<=2;i++){
for(int j=0;j<=2;j++){
scanf("%d",&a[i][j]);
}
}
字符数组
字符数组的定义
一维字符数组: char c[10];
二维字符数组: char a[3][2];
字符数组初始化
一维字符数组: char a[5]={'f','2','e','w','3'};
char b[]={'d','d'};
二维字符数组: char c[2][2]={{'q','c'},{'a','s'}};
char d[][2]={{'q','c'},{'a','s'}};
字符数组的引用:
一维字符数组:数组名[常量表达式];a[1+2]//a[1+2]=a[3]
二维字符数组:数组名[常量表达式x][常量表达式y];a[i][j];
字符输出格式:printf(“%c”,字符名);
字符数组输出格式: printf("%s",数组名);
传递数组给函数
在函数中传递一个数组作为参数,必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针
方式 1:形式参数是一个指针
void myFunction(int *param){}
方式 2:形式参数是一个已定义大小的数组
void myFunction(int param[10]){}
方式 3:形式参数是一个未定义大小的数组
void myFunction(int param[]){}
案例:
#include <stdio.h>
double getAverage(int arr[], int size);/* 函数声明 */
int main (){
int balance[5] = {1000, 2, 3, 17, 50};/*数组初始化 */
double avg;
avg=getAverage(balance,5) ;/*传递一个指向数组的指针作为参数 */
printf( "平均值是: %f ", avg ); /* 输出返回值 */
return 0;
}
double getAverage(int arr[], int size){
double avg,sum=0;
for (int i = 0; i < size; ++i){
sum += arr[i];
}
avg = sum / size;
return avg;
}
二维数组传递给函数
方法1: 第一维的长度可以不指定,但必须指定第二维的长度:
void print_a(int a[][5], int n, int m)
方法2: 指向一个有5个元素一维数组的指针:
void print_b(int (*a)[5], int n, int m)
方法3: 利用数组是顺序存储的特性,通过降维来访问原数组
void print_c(int *a, int n, int m)
从函数返回数组
C 语言不允许返回一个完整的数组作为函数的参数。可以通过指定不带索引的数组名来返回一个指向数组的指针。
想要从函数返回一个一维数组,必须声明一个返回指针的函数.
int * myFunction(){}
指向数组的指针
通过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针。
数组名是一个指向数组中第一个元素的常量指针
double balance[50];
balance是一个指向&balance[0]的指针,即数组balance的第一个元素的地址