目录

1、数组的定义

2、一维数组

2.1一维数组的格式

2.2一维数组的初始化

2.3一维数组的使用

2.4一维数组再内存中的存储

3、二维数组

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

3.2二维数组的使用

3.3二维数组的存储

4、数组作为函数参数


1、数组的定义

  • 数组是具有相同类型的集合,数组的大小(即所占字节数)由元素个数乘以单个元素的大小。
  • 数组只能够整体初始化,不能被整体赋值。只能使用循环从第一个逐个遍历赋值。

2、一维数组

2.1一维数组的格式

数组的创建方式:
        type_t 是指数组的元素类型
        const_n 是一个常量表达式,用来指定数组的大小

type_t arr_name [const_n];

2.2一维数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。
        初始化分为完全初始化和不完全初始化。

  • 完全初始化:表示对数组的每一个元素进行赋值。
  • 不完全初始化:表示对数组的部分元素进行赋值,没有被赋值的元素设为0。
int arr1[10] = {1,2,3};
将前三个元素初始化为1,2,3,后面的元素为0,这种初始化叫做不完全初始化
int arr2[] = {1,2,3,4};
没有给定元素个数时,内存会默认分配足够放置元素的空间,此时元素个数为4
int arr3[5] = {1,2,3,4,5};
每个元素都被赋值,完全初始化
char arr4[3] = {'a',98, 'c'};
98代表ASCII码值对应的字符b
char arr5[] = {'a','b','c'};
这里只储存了a、b、c三个字符,共三个元素
char arr6[] = "abcdef";
字符串有一个结束标志\0也要储存到数组中,共7个元素

2.3一维数组的使用

  • 对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。它其实就数组访问的操作行。我们来看代码:
int main()
{int i = 0;  //做下标int arr[10] = {0};//数组的不完全初始化//计算数组的元素个数int sz = sizeof(arr) / sizeof(arr[0]);arr[4] = 5;   //第5个元素赋值为5,这里的[4]是下标引用操作符//对数组内容赋值,数组是使用下标来访问的,下标从0开始:for(i=0; i<sz; i++) //这里写10好不好{printf("%d ",arr[i]);}//输出数组的内容
}

2.4一维数组再内存中的存储

  1. 数组在内存中开辟是线性连续且递增的。
  2. 数组在内存中连续存放且元素下标越大它的地址也越高。
int main()
{int arr[10] = {0};int i  = 0;for(i=0; i<10; i++){printf("&arr[%d] = %p\n",i,&arr[i]);}return 0;
}

输出:

&arr[0] = 006FF7A8
&arr[1] = 006FF7AC
&arr[2] = 006FF7B0
&arr[3] = 006FF7B4
&arr[4] = 006FF7B8
&arr[5] = 006FF7BC
&arr[6] = 006FF7C0
&arr[7] = 006FF7C4
&arr[8] = 006FF7C8
&arr[9] = 006FF7CC
请按任意键继续. . .
  • 可以看到,随着数组下标的增长,由于每个元素都为int类型,所以下标每增长1,数组元素的地址会加4
  • 也就是说,元素的地址,也在有规律的递增。

        【*p 和 int* p = arr 的含义】

int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int* p = arr;     //数组的地址就是数组首元素的地址,现在把数组地址放到指针p中//arr这个数组的地址放到p中,*说明是个指针变量,int:被指向的类型是整形int i = 0;for(i=0; i<=10; i++){printf("%d ",*p);   //*p就是解引用(p是地址,解引用就是把p地址上的东西拿出来)p++;          //p++就是下一个地址p} return 0 ;    }

3、二维数组

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

二维数组创建时,行数可以忽略不写。并且所有维度的数组其第一个方括号的内容可忽略

//数组创建
int arr[3][4];//[行数][列数]
char arr[][5];
double arr[2][4];
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};
int main()
{int arr1[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};int i = 0;int j = 0;for(i=0; i<=2; i++ ){for(j=0; j<=3; j++){printf("%2d ",arr1[i][j]);}printf("\n");}return 0;
}

花括号中的一个花括号代表一个一维数组的初始化。当里面无花括号分组时,按照顺序从第一个开始逐个进行初始化。余下的未赋值的元素用0初始化

3.2二维数组的使用

二维数组的使用也是通过下标的方式,用双重循环嵌套进行索引使用。 看代码:

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

3.3二维数组的存储

像一维数组一样,这里我们尝试打印二维数组的每个元素。

int main()
{int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};int i = 0;int j = 0;for(i=0; i<=2; i++ ){for(j=0; j<=3; j++){printf("&arr[%d][%d]=%p ",i,j,&arr[i][j]);}printf("\n");}return 0;
}
  1. 输出:说明二维数组在内存中也是连续存放的!行内部连续,跨行也是连续的!
  2. 通过结果我们可以分析到,其实二维数组在内存中也是连续存储的。
&arr[0][0]=00B5F6EC &arr[0][1]=00B5F6F0 &arr[0][2]=00B5F6F4 &arr[0][3]=00B5F6F8
&arr[1][0]=00B5F6FC &arr[1][1]=00B5F700 &arr[1][2]=00B5F704 &arr[1][3]=00B5F708
&arr[2][0]=00B5F70C &arr[2][1]=00B5F710 &arr[2][2]=00B5F714 &arr[2][3]=00B5F718
请按任意键继续. . .

还可以用下面的方法知道行内部连续,跨行也是连续的!

int main()
{int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};int i = 0;int*p = &arr[0][0];for(i=0; i<=12; i++ ){printf("%d ",*p);p++;}printf("\n");return 0;
}

4、数组作为函数参数

  • 往往我们在写代码的时候,会将数组作为参数传个函数,
  • 比如:我要实现一个冒泡排序( 这里要讲算法思想)函数将一个整形数组排序。那我们将会这样使用该函数:
void popo(int arr[],int sz)
{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[10] = {1,2,3,4,5,6,7,8,9,10};int sz = sizeof(arr) / sizeof(arr[0]);popo(arr,sz);return 0;
}

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

但是有两个例外:

  1. sizeof(数组名) 数组名表示整个数组
  2. &数组名,表示取这个数组的地址
//数组名是数组首元素的地址
//但是有两个例外
//1.sizeof(数组名) 数组名表示整个数组
//2.&数组名,表示取这个数组的地址
int main()
{int arr[10] = { 0 };printf("%p\n",arr);printf("%p\n",arr+1);printf("%p\n",&arr);printf("%p\n",&arr+1);//printf("%p\n",arr);//printf("%p\n",&arr[0]);return 0;
}

C语言初识(1) | C简介 | 主函数 | 数据类型

C语言初识(2) | 变量和常量

C语言初识(3) | 字符串 | 转译字符

C语言初识(4) | 顺序 | 选择 | 循环

C语言初识(5) | 函数 | 数组 | 操作符

C语言初识(6) | 关键字

C语言初识(7) | 指针| 结构体 | define

C语言初阶(8) | 选择结构 | if_else | switch

C语言初阶(9) | while | break | continue | getchar

C语言初阶(10) | 初识for循环 | 入门

C语言初阶(18) | 数组详解相关推荐

  1. C语言初阶作业题-数组

    C语言初阶作业题-数组 一.选择题 1.关于一维数组初始化,下面哪个定义是错误的?( ) A.int arr[10] = {1,2,3,4,5,6}; B.int arr[] = {1,2,3,4,5 ...

  2. c语言中的字符串数组,详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include #incl ...

  3. C语言 指针+二维数组详解 (应付期末、考研的最强笔记,建议收藏)

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  4. C语言二维字符数组详解

    二维字符数组一般用于存储和处理多个字符串,二维字符数组中的每一行均可存储表示一个字符串. 二维字符数组的定义 二维字符数组的定义格式为: char 数组名[第一维大小][第二维大小]; 如: char ...

  5. c语言 read 文件字节没超过数组大小时会怎样_剑指信奥 | C 语言之信奥试题详解(四)...

    趣乐博思剑指信奥系列 ❝ 趣乐博思剑指信奥系列,专门针对全国青少年信息学奥林匹克联赛 NOIP 而开展的专业教育方案.开设的课程有 C 语言基础,C++ 语言基础,算法设计入门与进阶,经典试题分析与详 ...

  6. C语言0长度数组(可变数组/柔性数组)详解

    CSDN GitHub C语言0长度数组(可变数组/柔性数组)详解 AderXCoding/language/c/zero_length_array 本作品采用知识共享署名-非商业性使用-相同方式共享 ...

  7. python定义字符串数组初始化_字符数组及其定义和初始化,C语言字符数组详解...

    字符数组及其定义和初始化,C语言字符数组详解 字符串的存储方式有字符数组和字符指针,我们先来看看字符数组. 因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别 ...

  8. c语言数组详解视频,C语言数组详解

    <C语言数组详解>由会员分享,可在线阅读,更多相关<C语言数组详解(55页珍藏版)>请在人人文库网上搜索. 1.就是一组具有固定数目的.有序的.类型相同的数据的集合.根据数组下 ...

  9. 五十分钟带你看遍C语言初阶语法(总纲)

    C语言初阶语法(总纲) 此篇博客包含了前面C语言所有的基础语法,写这一期的博客不仅是为了记录自己的学习成果也是为了让更多的朋友能学到对自己有用的知识,如果总有一个知识点帮助到了你,给卑微博主点点关注加 ...

最新文章

  1. 硕士全年不开学?一批高校发布秋季学期返校时间!
  2. ASP.NET MVC 第三章 异步提交数据
  3. SSH远程访问及控制
  4. ssacnf和sprintf实战取ip地址
  5. Centos环境下mysql源码编译安装
  6. 嗯...开始学java
  7. python实例方法、类方法、静态方法的区别_Python 实例方法、类方法、静态方法的区别与作用...
  8. linux服务 运维案例,linux运维实战练习案例-2015年12月20日-12月31日
  9. Linux shell multifile content replace with sed
  10. 云原生的本质_CloudNative
  11. cisco的路由器上rip的被动接口,单播更新,水平分隔
  12. Python分类求和方法
  13. DirectSOFT(光洋PLC编程软件)v6.3官方版
  14. VS2015 LNK2001:无法解析的外部符号 debug调试
  15. (附源码)springboot社区疫情防控管理系统 毕业设计 164621
  16. 直流电阻测量方法介绍
  17. 主动事务处理器编写BFM
  18. SEUS 转换XML到JAVA
  19. 设计模式超简单的解释!
  20. 购买PG霜,请认准官方网站

热门文章

  1. 每日算法_4月11日_02
  2. StringTemplate模板引擎
  3. Qt(C++)入门学习
  4. python弹性碰撞次数圆周率_碰撞出来的圆周率(一)
  5. doevents raiseevent withevents
  6. 2019-02-13 扇贝自动打卡贼简单版
  7. 详谈GoLang的panic和error
  8. 电影院移动端电影分区发行致力于开拓海外市场
  9. 练习:测测你优势教养的程度
  10. 509. 斐波那契数