【C/C++】数组的从无到有(上)

简介: 【C/C++】数组的从无到有(上)

目录



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

1.1数组如何创建

1.2数组的初始化

1.3一维数组的使用

1.4.一维数组在内存中的存储

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

2.1二维数组的创建

2.2二维数组的初始化

2.3二维数组的使用

2.4二维数组在内存中的存储

3.数组越界

4.数组作为函数参数

4.1冒泡排序的错误设计

4.2数组名是什么

4.3 冒泡排序函数的正确设计


正文


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


1.1数组如何创建


首先我们得清楚什么是数组,数组是这样定义的:

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

我们来看一看数组是如何创建的:


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


举个例子:

1. //代码1
2. int arr1[10];

这里我们定义了一个数组arr1,那么我们该怎么描述它呢?

arr1是一个包含了10个元素,且每个元素都是int类型的数组

依照此例,我们再试着创建几个不一样的数组:

//代码2
char arr2[10];//数组包含10个元素,且每个元素都是char类型
float arr3[1];//数组包含1个元素,且每个元素都是float类型
double arr4[20];//数组包含20个元素,且每个元素都是double类型

模仿这个格式,我们之后就可以创建各式各样的数组。

此处,再介绍一个另类的写法:

//代码3
int count = 10;
int arr2[count];

但是这种写法有个小小的问题:

这种写法只能在支持C99标准的编译器环境下能编译。在C99标准之前, [] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念。

变长:指的是长度可变。

例如,在Visual Studio中不支持这种写法。


1.2数组的初始化


数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。


例如:

int arr1[10] = { 1 };//不完全初始化,第一个元素初始化为1,其余的元素默认初始化为0
    int arr2[] = { 1,2,3,4 };
    int arr3[5] = { 1,2,3,4,5 };
    char arr4[3] = { 'a',98, 'c' };
    char arr5[] = { 'a','b','c' };
    char arr6[] = "abcdef";

我们发现,其中有些数组[ ]中没有指定数组大小,但是这种写法也是正确的。是因为:


数组在创建的时候如果不想指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。


1.3一维数组的使用


在数组的使用之前,我曾在第一篇博客中介绍过数组和一个操作符:[ ],下标引用操作符


我们先来看完整代码:

#include <stdio.h>
int main()
{
  int arr[10] = { 0 };//数组的不完全初始化
     //计算数组的元素个数
  int sz = sizeof(arr) / sizeof(arr[0]);
  //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
  int i = 0;//做下标
  for (i = 0; i < 10; i++)//这里写10,好不好?
  {
    arr[i] = i;
  }
  //输出数组的内容
  for (i = 0; i < 10; ++i)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

我们一般用sizeof来求数组的长度:


int sz = sizeof(arr) / sizeof(arr[0]);
//sizeof(arr)    求数组的总大小
//sizeof(arr[0])   求数组每个元素的大小
//数组元素个数 = 数组总大小 / 数组每个元素大小

接着我们用for循环对数组进行初始化,使得数组的内容为数字0~9

 int i = 0;//做下标
 for (i = 0; i < 10; i++)
 {
    arr[i] = i;
 }

再次使用for循环将数组内容打印到屏幕上

1.     //输出数组的内容
2.     for (i = 0; i < 10; ++i)
3.     {
4.         printf("%d ", arr[i]);
5.     }
6.     return 0;

总结:

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

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


1.4.一维数组在内存中的存储


先来看一串代码:


#include <stdio.h>
int main()
{
  int arr[10] = { 0 };
  int i = 0;
  int sz = sizeof(arr) / sizeof(arr[0]);
  for (i = 0; i < sz; ++i)
  {
    printf("&arr[%d] = %p\n", i, &arr[i]);
  }
  return 0;
}


不难理解,这串代码的作用是在屏幕上展示数组每个元素的地址,结果如下:

1.png

仔细观察我们发现,数组中每两个相邻的元素地址相差 4 (十六进制形式表现),正好是一个int类型的大小。而且随着下标的增长,元素的地址也有递增的规律

由此可以得出结论:数组在内存中是连续存放的

2.png


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


2.1二维数组的创建


二维数组的创建有点类似与一维数组:


type_t   arr_name[row][col];
//type_t    是指数组的元素类型
//arr_name    是数组名
//row    是一个常量表达式,用来指定数组有多少行元素
//col     是一个常量表达式,用来指定数组有多少列元素

例如:

int arr[3][4];
char arr[3][5];
double arr[2][4];

接着再来看看二维数组的初始化。


2.2二维数组的初始化


//数组初始化
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12 };
int arr[3][4] = { {1,2},{4,5} };//不完全初始化
int arr[][4] = { {2,3},{4,5} };

注:数组的不完全初始化,其他内容默认为0。

int arr[][4] = { {2,3},{4,5} };//实际存储为//{{2,3,0,0},{4,5,0,0}}


2.3二维数组的使用


二维数组的使用也是通过下标的方式。

如下:

#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.png

如果到这里我们对二维数组的结构还不太清楚的话,接着来看一看二维数组在内存中的存储。


2.4二维数组在内存中的存储


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

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

输出结果如下:

1.png

仔细观察我们发现,二维数组中每行元素里相邻的两个元素地址相差 4,正好为int类型大小。

且每一行最后的一个元素与下一行开头的元素地址也相差 4。

通过分析我们得出结论:二维数组在内存中也是连续存储的。

2.png


目录
相关文章
|
14天前
|
存储 C++
C++程序中的对象数组
C++程序中的对象数组
19 0
|
11天前
|
存储 C++
C++指针数组
C++指针数组
21 1
|
14天前
|
存储 C++
C++程序数组与指针:深入理解与实践
C++程序数组与指针:深入理解与实践
23 1
|
14天前
|
存储 算法 C++
C++程序一维数组:深入理解与实践
C++程序一维数组:深入理解与实践
23 1
|
7天前
|
存储 C++ 索引
c++数组
c++数组
16 2
|
11天前
|
存储 C++ 索引
C++数组
C++数组
19 0
|
11天前
|
C++
C++ 重载 数组对象输入输出流的实现!!!
C++ 重载 数组对象输入输出流的实现!!!
|
13天前
|
存储 搜索推荐 程序员
C++ 数组
C++ 数组
20 0
|
14天前
|
存储 C++ 索引
C++程序字符数组:深入理解与实践
C++程序字符数组:深入理解与实践
23 2
|
19天前
|
存储 C++
【C++模板】模板实现通用的数组
【C++模板】模板实现通用的数组