查看: 95|回复: 0

c语言3-数组详解

[复制链接]

5

主题

7

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-3-17 11:03:17 | 显示全部楼层 |阅读模式
1.一维数组


  • 一维数组的创建和初始化
  • 一维数组的使用
  • 一维数组在内存中的存储
2.二维数组


  • 二维数组的创建和初始化
  • 二维数组的使用
  • 二维数组在内存中的存储
*3.数组作为函数参数


<hr/>
1.1一维数组的创建和初始化

数组:一组相同类型元素的集合
初始化:在创建数组的同时给元素赋值
注意:数组创建时,[]里面可以用常量,也可以用宏定义,但是不能使用变量
一维数组的创建
type_t arr_name [const_n]

//tyoe_t 数组中元素类型
//arr_name 数组名
//const_n 常量表达式:用来指定数组大小

如:
int arr1[10];
或:
#define M 3
int arr2 [M];一维数组的初始化
1.完全初始化(数组大小==数值个数)
int arr[5]={1,2,3,4,5};2.不完全初始化(数组大小>数值个数)
后面没被赋值的元素全部默认为/0;
int arr[5]={1,2,3};
int arr[]={1,2,3};
char arr[]={'a','b','c'}; 对于字符数组存储字符串
由于C语言中没有字符串类型,字符串是存放在char型数组中的,将字符串作为char数组来处理
为了测定字符串的实际长度,字符串需要一个结束标志。
故:存放字符串时,需要一个空间用来存储'\0'。
[字符串的结束标志'\0']
char arr[]="abcde";
char arr[10]="abcde"
//由于数组大小>字符串个数,元素e后面默认存放'\0'
char arr[5]="abcde";
//由于数组大小=字符串个数,元素e后面没有空间存放"\0"
故:无法读取字符串的结束标志,导致字符串长度和内容随机
(可能该字符串在后面的某个空间地址存放了'\0'才使得读取结束)

1.2一维数组的使用

[],下标引用操作符(用来进行数组内容访问)
数组中每个元素都有一个序号,这个序号是从0开始,称为下标
  sizeof()是操作符,用于计算数组(整个数组/单个元素)大小,以字节为单位
#include<stdio.h>

int main()
{
int arr[5]={1,2,3,4,5};//数组创建和初始化

int sz=sizeof(arr)/sizeof(arr[0]);//计算数组元素个数

int i=0;
for(i=0;i<sz;i++)//打印数组每个元素
{
printf("%d",arr);//访问下标i所对应的内容
}
     return 0;
}
//结果:输出12345

//sizeof(arr) 求整个数组的大小
//sizeof(arr[0]) 求一个元素的大小
1.3一维数组在内存中的存储

一维数组在内存中是连续存放的(由低地址-----到高地址)
数据类型
char 1字节
short 2字节
int,float,long,unsigned long 4字节
double, long long 8字节
注意:指针类型(无论什么数据类型) 4字节(32位操作系统),8字节(64位操作系统)
每次需要开辟(元素个数*类型大小)个字节空间。

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

一个二维数组可以看成多个一维数组
(一个行数代表一个一维数组)
二维数组的创建
注意:行数可以忽略不写,但是列数必须要写
int arr[2][4]//[行数][列数]
int arr[][4]二维数组的初始化
int arr[2][4]={1,2,3,4}
//结果:
1 2 3 4
0 0 0 0
int arr[2][4]={{1,2},{3,4}}
//结果:
1 2 0 0
3 4 0 0
int arr[][4]={{1,2},{3,4}}
//结果:
1 2 0 0
3 4 0 0
...注意:一个{}代表一个一维数组的初始化。未被赋值的元素用0初始化

2.2二维数组的使用

二维数组的使用也是通过下标访问的方式
如果要打印二维数组,需要使用双重循环嵌套的方式
#include<stdio.h>

int main()
{
int arr[2][4]={1,2,3,4};
int i,j=0;
for(i=0;i<2;i++)//行数为i,即有i个一维数组
{
     for(j=0;j<4;j++)//每一个一维数组有j个元素
     {
         printf("%d ",arr[j]);
     }
     printf("\n");
}
     return 0;
}
//结果:
1 2 3 4
0 0 0 0
2.3二维数组在内存中的存储

二维数组在内存中是连续存放的(由低地址-----到高地址)
二维数组的本质也可以看成一维数组,只是元素是一维数组
每次需要开辟(元素个数*类型大小)个字节空间。

*3.1数组作为函数参数

3.1.1一维数组
调用函数传参数组时
传值:由于形参是实参的一份临时拷贝,如果数组过大,成本(时间和空间)会大大增加
传址:运用指针的方式,让其指向内部元素
int arr[5]={1,2,3,4,5}
//代表有5个元素的一维数组,该元素的类型是int

sizeof(arr)//数组总大小
sizeof(arr[0])//数组中一个元素大小

//实参
(arr)//代表数组首元素地址
(arr+1)//代表数组首元素的下一个元素地址
(&arr)//代表整个一维数组地址,但是地址也是指向首元素地址
(&arr+1)//代表跳过整个一维数组,指向紧挨的地址

//形参
int arr[]//形参元素个数可以省略(可能改变实参的大小)
int* arr&数组名,取出的是整个数组的地址
sizeof(数组名),计算整个数组的大小

3.1.2二维数组
把二维数组当成多个一维数组
每个元素是一维数组(即指针+1时,是+一个一维数组)
int arr[2][2]={0}
//代表有两个一维数组元素的二维数组,该一维数组元素的类型是int

//实参
(arr)//代表数组首元素(第一个一维数组)地址
(arr+1)//代表数组首元素的下一个元素的地址(指向第二个一维数组的首元素)
(&arr)//代表整个二维数组,但是地址也是指向首元素地址(第一个一维数组)
(&arr+1)//代表跳过二维数组,指向紧挨着的地址

//形参
int arr[][2]
int(*arr)[2]
*指针数组数组指针
*指针数组:数组,数组的元素是指针
数组指针:指针,指向数组
优先级:()> [ ] > *
*pa[n]:指针数组,pa是数组,元素有n个,该元素的类型是指针
(*pa)[n]:数组指针,pa是指针,指向一个一维数组,该数组元素n个
//指针数组
在(0-5内)输入中文数字,打印英文数字

#include<stdio.h>

int main()
{
        char* arr[6] = { {"zero"},{"one"},{"two"},{"three"},{"four"},{"five"} };
        int n;
        scanf_s("%d", &n);
        printf("%s", arr[n]);

        return 0;
}
//结果:输入1 输出one
//数组指针
int arr[2][2] = { 0,1,1,2 };
//一个有两个元素
0 1// 第一个一维数组元素
1 2//第二个二维数组元素
int(*pa)[2] = arr;//该指针指向首元素地址(第一个一维数组)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表