4

C语言——数组_mb62d54e7423bba的技术博客_51CTO博客

 2 years ago
source link: https://blog.51cto.com/u_15722538/5655885
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C语言——数组

精选 原创

普热希缇 2022-09-06 15:25:02 博主文章分类:c语言 ©著作权

文章标签 数组 初始化 数组名 文章分类 C/C++ 编程语言 yyds干货盘点 阅读数203

一:一维数组

(1).数组的创建

    定义:数组是一组相同类型元素的集合   

******创建方式:(重要)

type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小

(注意:数组名是数组​首元素的地址)

C语言——数组_数组名

如:

int arr[8];//表示数组内的元素为整形,arr表示数组名,放了8个元素

float arr3[2+3];//2+3是一个常量表达式

double arr4[5] = 10;//浮点数在内存中无法精确保存

int arr5[n];//这种  将变量放在[]中   在C99语法中才是支持的。VS2019是不支持变长数组(数组的大小是变量),平时别这样做

(2)数组的初始化(在创建数组的基础上给数组一些合理的初始值)

A:整形数组

1.完全初始化:int arr[10] = {1,2,3,4,5,6,7,8,9,10};//像这种给予初始值个数与数组大小相同

C语言——数组_数组名_02

2. 不完全初始化:int arr[10] = {1,2,3,4};//像这种只对部分元素赋值,剩下的默认为0

C语言——数组_初始化_03

3.int arr[] = { 1,2,3,4 };//像这种没有指定大小的,会根据初始化的内容来确定它的个数相当于int arr[4] = { 1,2,3,4 };

B:字符数组

      a:  1.  char ch1[3] = {'b','i','t'}

           2.  char ch2[5] = {'b','i','t'}

           3.  char ch3[] = {'b','i','t'};默认3个字符

     b:字符串形式(字符串中自带一个\0)

                 char ch1[5] = "bit";//b i t \0 0       5个元素    

                 char ch2[] = "bit";//b i t \0      4个元素

注意:数组长度与字符串长度是两个东西

当用strlen求长度时ch1为3,ch2也为3

(3).一维数组的使用

数组的使用中会用到下标引用操作符 [] 。它其实就是数组访问的操作符。

注意:  数组是使用下表来访问的

           数组的下表都是从0开始的

           进行数组的访问时[]内可以是变量,数组创建时必须为常量   

          数组的大小可以通过计算得到 

int arr[10]
int sz = sizeof(arr)/sizeof(arr[0])

举例:  arr[4] = 5;//将数组中下表为4的数赋值为5

#include<stdio.h>
int main()
{
int arr[10] = {0};//不完全初始化
arr[4] = 5;
printf("%d\n",arr[4]);
return 0;
}

//输出:5
#include <stdio.h>
int main()
{
int arr[10] = {0};
arr[4] = 7;
int sz = sizeof(arr)/sizeof(arr[0]);//计算数组的大小
int i = 0;
for(i=0; i<sz; i++)
{
printf("%d ", arr[i]);//打印
}
return 0;
}

//输出:0 0 0 0 7 0 0 0 0 0

(4).一维数组在内存中的存储

接下来我们来探讨数组在内存中的存储

C语言——数组_数组名_04

可以得出一字节给一个地址,而一个整形占4个字节

所以:一维数组在内存中是连续存放的

 随着数组下标的增长,地址是由低到高变化的

C语言——数组_数组名_05
C语言——数组_数组_06

二、二维数组

1.二维数组的创建(数组创建中前面的[]表示行,后面的[]表示列)

int arr[3][4];//整形  三行四列

char arr[3][4];//字符  三行四列

2.二维数组的初始化()

完全初始化:

C语言——数组_数组名_07

不完全初始化:int arr1[3][4] = {1,2,3,4,5};//5后面补0

注意这种形式: int arr2[3][4] = {{1,2},{3,4},{5,6}};

注:数组如果有初始化,行可以省略,列不能省略

int arr[][4] = {{1,2},{3,4},{5,6}};//几行可以通过初始化来确定,嵌套的{}有几个代表有几行

C语言——数组_初始化_08

3.二维数组的使用

进行数组的访问时与一维数组相似,行间从0开始,列间也是从0开始

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

//1 2 0 0
//3 4 0 0
//5 6 0 0

4.二维数组在内存中的存储

与一维数组一样,先进行地址的打印,得出每一个元素的地址

C语言——数组_数组名_09

在图中可以看出前4个地址是以4逐渐递增的,而第四个与第五个之间也是相差4.

由此得出:二维数组在内存中也是连续存储的

                一行内部连续,跨行也是连续的

三.数组作为函数参数

首先我们举个实例:将一组降序数弄成升序数 如:9,8,7,6,5,4,3,2,1,0

//冒泡排序
#include<stdio.h>
void bubble_sort(int arr[],int sz)//形参arr本质上是指针
{
int i = 0; //确定进行几趟
for(i=0;i<sz-1;i++)
{
int j = 0;//一趟进行几次交换
for(j=0;j<sz-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main()
{
int arr[] = {9,8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr)/sizeof(arr[0]);//计算数组的元素个数 ,不能放在bubble_sort函数中
bubble_sort(arr,sz);//数组传参的时候,传的是数组首元素的地址
return 0;
}

//但是当我们给出一组升序的数时,就会平白的浪费效率于是
//在函数中
void bubble_sort(int arr[],int sz)//形参arr本质上是指针
{
int i = 0; //确定进行几趟
flag = 1;
for(i=0;i<sz-1;i++)
{
int j = 0;//一趟进行几次交换
for(j=0;j<sz-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
flag = 0;
}
}
if(flag == 0)
{
break;
}
}
}

当一个数组传参的时候,传递过去的形参部分的数组在函数内部是无法计算它的元素个数的,所以我们一般放在主函数中计算。

注意:数组名是什么?

  数组名是数组首元素的地址

但是有两个例外:

1.sizeof(数组名)     

      这个时候的数组名表示整个数组 ,  计算的是整个数组的大小   , 单位是字节

2.&数组名

     这里的数组名表示整个数组  ,  取出的是整个数组的地址  

C语言——数组_初始化_10

在图中,我们可以看到3中不同方式下地址却是一样的

 首先后两种是取的是首元素的地址是没问题的,但是由上头的特例知道第一个应该是(整个)数组的地址,这是为什么呢?

其实数组的地址就是首元素的地址,虽然值相同,但是意义不一样

C语言——数组_初始化_11

&arr取得是整体的地址,只是打印时显示首元素的地址

C语言——数组_数组_12

当加1时可知前两个差40,后面差4(地址的形式是16进制)。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK