C语言——数组

一:一维数组

(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语言——数组

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

C语言——数组

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:字符串形式(字符串中自带一个

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

                 char ch2[] = "bit";//b i t       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("%dn",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语言——数组

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

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

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

C语言——数组

C语言——数组

二、二维数组

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

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

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

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

完全初始化:

C语言——数组

不完全初始化: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语言——数组

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语言——数组

在图中可以看出前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语言——数组

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

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

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

C语言——数组

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

C语言——数组

发表评论

相关文章