学C的第十二天【深入了解数组:一维和二维数组的创建和初始化;一维和二维数组的使用;一维和二维数组在内存中的存储;数组越界;数组作为函数参数;冒泡排序(对数组名的理解)】-1

简介: 1.一维数组的创建和初始化

1cc285d2c014493f8dedbaca0ac82878.png1cc285d2c014493f8dedbaca0ac82878.png1.一维数组的创建和初始化

1.1 数组的创建

数组一组相同类型元素集合 


数组的创建方式:


type_t                arr_name                [const_n]


  ⬇                                                            ⬇      


                       (数组的元素类型)               (是一个常量表达式,用来指定数组的大小)


  ⬇                                                            ⬇      


        举例:                int                           arr                          [10]      

数组创建的实例

int arr[10]; //整形数组
char arr3[10]; //字符数组
float arr4[1]; //浮点数数组
double arr5[20]; //双精度浮点数数组

:数组创建,在C99标准之前,[ ]中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。)

#include <stdio.h>
int main()
{
  int arr[10]; //创建数组
  int count = 10; //生成一个整形变量
  int arr2[count]; //使用变量声明数组大小
  //VS2019 VS2022 这样的IDE,不支持C99中的变长数组
  //C99 标准之后 数组的大小只能是常量表达式
  //C99 标准中引入了 变长数组的概念,使得数组在创建的时候
  //可以使用变量,但是这样的数组不能初始化
  return 0;
}

4028c2ce7bbb44a898a211db73355ee0.png

1.2 数组的初始化

创建数组的同时给数组的内容一些合理初始值(初始化)

数组初始化的实例

 

#include <stdio.h>
int main()
{
  int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; 
  //完全初始化
  int arr2[10] = { 1,2,3 }; 
  //不完全初始化,剩余的元素默认都是0
  //数组在创建的时候如果想不指定数组的大小就得初始化,
  //数组得元素个数根据初始化得内容来确定。
  int arr3[] = { 1,2,3 }; 
  //省略数组的大小,数组必须初始化,数组的大小
  //根据初始化内容决定
//字符数组初始化:
  char arr4[] = "abc"; 
  //这样是4个元素:a、b、c、\0
  char arr5[] = {'a','b','c'};
  //这样是三个元素:a、b、c。不会自动创建\0
  char arr6[] = { 'a',98,'c' };
  //可将字符写成ASCII码值,98对应b
  return 0;
}

image.png

2.一维数组的使用

 

操作符 [ ]下标引用操作符,它其实就是数组访问的操作符

 

一维数组的使用实例

 

//一维数组的使用
#include <stdio.h>
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  //下标:   0 1 2 3 4 5 6 7 8 9 
  printf("%d\n", arr[5]); // []:下标引用操作符,
  //找到数组中下标为5的元素 
  printf("%d\n", arr[0]); 
  //找到数组中下标为0的元素
  int i = 0;
  int sz = sizeof(arr) / sizeof(arr[0]); //求元素个数
  //元素个数 = 整个数组大小 / 每个元素大小
  //strlen是求字符串长度的,sizeof是求整形数组大小的
  //循环输出数组元素:
  for ( i = 0; i < sz; i++)
  {
    scanf("%d", &arr[i]);
    //&arr[i]:取数组元素i的地址
  }
  //循环打印数组元素:
  for ( i = 0; i < sz; i++ ) //小于元素个数就继续打印
  {
    printf("%d", arr[i]); 
    //这里是访问元素,不是创建数组,所以可以使用arr[]
    //中可以使用变量i,即arr(i)
  }
  return 0;
}

image.png

 

总结:

1. 数组使用下标来访问的,下标是从0开始

  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  //下标:   0 1 2 3 4 5 6 7 8 9 

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

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

3.一维数组在内存中的存储(32位操作系统)

 

(演示代码:)

 

//数组在内存中的存储
#include <stdio.h>
int main()
{
  int arr[10] = { 1,2,3,4,5 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  for ( i = 0; i < sz; i++ )
  {
    printf("&arr[%d] = %p\n", i, &arr[i]);
    //%d 对应 i
    //%p 对应 &arr[i]
    //&arr[i] 为取 数组中元素i的地址
  }
  return 0;
}

 

int类型的数组中,相邻的两个元素相差4个字节,因为一个整形元素占4个字节)  

 

0b3dbc92e8064990958c9648eba33211.png

一维数组内存中连续存放的,所以当知道了数组的起始地址,就可以知道后面的其它元素


91fb679ab2424e759b82c0dea51cf3b8.png

4.二维数组的创建和初始化

4.1 二维数组的创建

//数组创建
//第一个[]:行    ;    第二个[]:列
int arr[3][4];
char arr[3][4];
double arr[3][4];

4.2 二维数组的初始化

//二维数组的初始化
#include <stdio.h>
int main()
{
  //二维数组的初始化
  int arr[4][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{4,5,6,7,8} }; 
  //第一种方式:使用{}一行一行赋值
  int arr2[4][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7,4,5,6,7,8 };
  //第二种方式:一行放满后放下一行
  int arr3[4][5] = { {1,2,3},{5,6},{3,4,5},{4,5,6} };
  //不完全初始化:未赋值的会用0补齐
  int arr4[4][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7,4,5,6 };
  //不完全初始化:未赋值的会用0补齐
  //二维数组即使初始化了,行也是可以省略的,但是列是不能省略的
  int arr5[][5] = { {1,2,3},{2,3,4},{3,4,5,6,7},{1,1,1,},{2,2,2} };
  //行可以通过输入的数据确定
  return 0;
}

1cc285d2c014493f8dedbaca0ac82878.png

相关文章
|
10月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
3143 0
|
10月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
446 15
|
10月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
1026 1
|
10月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
1312 0
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
586 6
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
1091 0
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。