第五章 数组Ivor Horton

5.1数组简介

说明数组的概念的及其作用的最好方法,是通过一个例子,来说明使用数组后程序会变得非常简单

5.1.1 不用数组的程序

如何声明一个数组

数据类型 数组名称[长度];

C语言中的数组初始化是有三种形式的
数据类型 数组名称[长度n] = {元素1,元素2…元素n};
数据类型 数组名称[] = {元素1,元素2…元素n};
数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n] = 元素n+1;

5.1.2 什么是数组
  • 字符串碰到了零,就意味着字符串结束了,是一个标
  • 标准库提供一个memset把字符数组清零
  • 数组是一组数目固定,类型相同的数据项,数组中的数据项称为元素。

    int numbers [10];//声明数组 类型名称 数组名[元素个数]

  • 方括号中的数字定义了要存放在数组中的元素个数,称为数组维

  • 数组有一个类型,它组合了元素的类型和数组中的元素个数

  • 存储在数组中的每个数据项都用相同的名称访问,在上述例子中,该名称就是numbers.可以在数组名称后的方括号内使用索引值,索引值是从零开始的连续的整数。0是第一个元素的索引值,注意,索引值是从0开始的,不是1.数组元素的索引值是与第一个元素的偏移量

    存在的问题

  • 如何访问数组元素的值?

  • 如何访问数组元素???
    (1)要选择某个元素,可以在数组名称后的方括号内使用索引值
    (2)在程序执行期间计算的整数表达式。该整数必须是对数组有效的索引值。

5.13 使用数组

  • 数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的参数:

(1)、整个数组当作函数参数,即把数组名称传入函数中,例如:

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

}

2、数组中的元素当作函数参数,即把数组中的参数传入函数中,例如:

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

数组作为函数参数时注意以下事项:
1、数组名作为函数实参传递时,函数定义处作为接收参数的数组类型形参既可以指定长度也可以不指定长度。
2、数组元素作为函数实参传递时,数组元素类型必须与形参数据类型一致


5.2 寻址运算符 &

  • 寻址运算符&输出其操作数的内存地址,寻址运算符&广泛用于scanf(),寻址运算符放在存储输入的变量名称之前,scanf()函数就可以利用这个变量的地址
  • 把寻址运算符放在变量名称之前,函数就可以利用这个变量的地址。
  • 使用%u显示sizeof生成的值
  • 使用新的格式说明符%p来输出变量的地址(内存地址)

5.3 数组名称和地址

long number[4]
  • 数组名称*number指定了存储数据项的内存区域地址*,把该地址和索引值组合起来就可以找到每一个元素
  • 声明数组时要给编译器提供为数组分配内存所需的所有信息
  • 值的类型决定了每个元素需要的字节数
  • 数组维指定看元素的个数
  • 数组占用的字节数元素个数乘以每个元素的字节数
  • 数组元素的地址是数组开始的地址,加上元素的索引值乘以数组中每个元素类型所需的字节
5.4 数组的初始化
  • 在大括号中指定一列初值,它们用逗号分开,并且数组大小由列表中的初值个数来确定。
    double values[] = { 1.5, 2.5, 3.5, 4.5, 5.5 }
    此语句声明了包含5个元素的数组values,values[0]的初值是1.5
  • 整个数组初始化为零
    double values[5] ={0.0}
  • 前三个元素用括号内的值初始化,后两个元素初始化为0
    double values[5] ={1.5, 2.5, 3.5}

5.5 确定数组的大小

  • sizeof 运算符可以计算指定类型的变量所占用的字节数,
 printf("The size of a variable of type long is %zu bytes.\n", sizeof(long));
  • sizeof运算符后的类型名称的括号是必须的

注意

  • sizeof运算符生成size_t类型的值
  • sizeof运算符用于数组可以

数组的声明

        double values[5] = {1.5, 2.5, 3.5, 4.5, 5.5 }
  • 可以用以下语句输出这个数组所占用的字节数
    printf(“The size of the array, values , is %zu bytes.\n”, sizeof values);
  • 输出如下:
    The size of the array, values, is 40 bytes.

数组占用的内存是单个元素的字节数乘以元素个数, 使用sizeof运算符计算数组中元素的数目

 size_t    element_count = sizeof values/sizeof values[0];
  • 计算数组元素的数量
size_t element_count = sizeof values/sizeof(double);

  • sizeof运算符应用于变量时不需要使用括号,但一般还是使用它们
double values[5] = {1.5, 2.5, 3.5, 4.5 , 5.5}
size_t element_count = sizeof(values)/sizeof(values[10])
printf("The size of the array is %zu bytes ", sizeof(values));
printf("and there are %u elements of %zu bytes each\n", element_count, sizeof(values)[0]));

该语句输出如下:

The size of the arry is 40 bytes and  there are 5 elements of   8 bytes each

*在使用循环处理数组

double values[5] = { 1.5, 2.5, 3.5, 4.5, 5.5 };
double sum = 0.0;
for(unsigned int i = 0; i < sizeof(values)/sizeof(values[0]) ; ++i)
sum +=values[i];
printf("The sum of the values is %.2f", sum );

这个循环将数组中所有的元素加起来,使用sizeof运算符计算数组的元素的个数

5.6 多维数组

  • 声明二维数组
    float carrots[25] [50];
    以上语句声明了一个数组carrots,它包含25行50个浮点数元素。注意:每一维都放在自己的方括号中。
  • 声明二维浮点数组
    float number[3][5];
  • 分配给每个元素的内存量取决于数组所含的变量的类型
    float number [4] [10]
    数组元素类型float.占4 个字节。数组占用的内存总数4*4*10个字节,即160个字节

5.7 多维数组的初始化

多维数组的定义格式是:

数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n];

二维数组的初始化

二维数组的初始化类似于一维数组的初始化,区别是把每一行的初始值放在大括号{}中,再把所有行放在一对大括号中:

int number [3] [4] =      {

                                           { 10, 20, 30, 40 },
                                           { 15, 25, 35 ,45 },
                                           { 46, 48, 49, 59 }
                                    };

三维数组的初始化
三维数组有三级嵌套的括号;内层的括号包含每行的初始值。

int  number [2][3][4] ={
                                      {
                                           { 10, 20, 30, 40 },
                                           { 15, 25, 35 ,45 },
                                           { 46, 48, 49, 59 }
                                     },
                                     {
                                           { 10, 20, 30, 40 },
                                           { 15, 25, 35 ,45 },
                                           { 46, 48, 49, 59 }
                                    }
                                  };

如果提供的初始值个数少于行中的元素数,就必须给每一行的值加上括号。

  • 利用嵌套循环处理多维数组中的所有元素,嵌套的层数就是数组的维数
    int sum = 0;
      for( int i = 0, i < 2; ++i)
      {
          for(int j = 0, j < 3; ++j)
          {
             for(int k =0, k <4 ; ++k)
             {
                sum += number[i][j][k];
             }
          }
      }
printf("The sum of the value in the numbers array is %d.", sum);
  • 使用sizeof运算符可以确定多维数组中每一维的元素个数
for(int i = 0, i < sizeof(numbers)/sizeof(numbers[0]) ; ++i)
{
    for(int j = 0, j < sizeof(numbers[0])/sizeof(numbers[0][0]) ; ++j)
    {
        for(int k = 0, k <sizeof(numbers[0][0]/sizeof(numbers[0][0][0]); ++k)
        {
            sum += numbers[i][j][k];
        }
    }
}

5.8变长数组

什么是变长数组?
变长数组的作用是什么???是为了达到怎样的目的呢?是实现什么呢??

可以定义其长度在程序运行期间确定的数组

size_t size = 0;
printf("Enter the  number of elements you want to store: ");
scanf("%zd", &size);
float values[size];

以上代码,把从键盘上读取的一个值放在size中,使用size的值指定数组的的长度。因为size_t 是用实现代码定义的整数类型,

还可以在执行期间确定二维或多维数组中的任意或所有维。例如:

size_t rows = 0;
size_t columns = 0;
printf("Enter the number of rows you want to store: ");
scanf("%zd",&rows);
printf("Enter the number of columns in a row: ");
scanf("%zd",&columns);
float beans[rows][columns];
#ifdef   ___STDC_NO_VLA__
   printf("Variable  length arrays are not supported.\n");
   exit(1);
#endif

以上代码用于检测编译器是否支持变成数组。

int num[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

这样定义了一个名称为num数据类型为int二维数组。其中第一个[3]表示第一维下标的长度,就像购物时分类存放的购物;第二个[3]表示第二维下标的长度,就像每个购物袋中的元素。
我们可以把上面的数组看作一个3×3的矩阵,
num[0][0] = 1 num[0][1]=2 num[0][2] = 3
num[1][0] = 4 num[1][1]=5 num[0][2]
= 6
num[2][0] = 7 num[2][1]=8 num[0][2] = 9

多维数组的初始化与一维数组的初始化类似也是分两种:

1、数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n] = {{值1,..,值n},{值1,..,值n},…,{值1,..,值n}};
2、数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n]; 数组名称[下标1][下标2]…[下标n] = 值;

多维数组初始化要注意以下事项:

1、采用第一种始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数
2、采用第二种初始化时数组声明必须同时指定行和列的维数

现有三行三列的二维数组int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};,编写程序实现计算对角线元素之和。

#include <stdio.h>

int main()
{
    int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    int i, j;
    int sum = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            if (i % 2 == 0 && j % 2 == 0)
                sum += arr[i][j];
        }
    }
    sum += arr[1][1];
    printf("对角线元素之和是: %d\n",sum);
    return 0;
}

字符串的长度

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(void)
{
    char str[10]={'H','e','l','l','o','\0'}

    printf("string length : %\n",strlen(str));
return 0;
}

遍历数组的元素

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main (void)
{
   char str[] ="hello world";

   for(int i=0;i<11;i++)
   {
      printf("[index:%d]%c\n",i,str[i]);
   }

return 0;
}

如何在c语言中创建和使用数组

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int  len =10;
    int  arr[len] ;//这种形式是错的 int arr[10];

   for(int  a =0;a<len;a++)
   {
      arr[a] = 0;
   }


   for(int i =0;i<len;i++)
   {
      printf("index %d,and value is  %d\n",i,arr[i]);
   }
   return 0;
}

数组的初始化

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

int main (void)
{
    int arr[3][4];

    for(int i=0; i<3; i++)
    {
        for(int  j=0; j<4;j++)
        {
             arr[i][j] =0;
        }
     }
     for(int i=0; i< 3;i++)
     {
          for( int j =0;i<4;j++)
          {
              printf("index(%d,%d),%d\n",i,j,arr[i][j]);
          }
      }
  return 0;
}

综合题

在一个长度为10的整型数组里面,保存了班级10个学生的考试成绩。要求编写5个函数,分别实现计算考试的总分,最高分,最低分,平均分和考试成绩降序排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注意:由于上传大小限制,此电子书分为两个压缩包,此压缩包part1为第一部分,需下载part2后同时进行解压!!!! 《Visual C++2010入门经典(第5版)》:使用visual C++ 2010支持的两种C++语言技术讲述C++编程的基础知识。 分享c++程序的错误查找技术,介绍程序调试的通用准则。 讨论每一个windows应用程序的结构和基本素。 举例说明如何用mfc开发本地windows应用程序。 指导读者用C++和C++/Cli设计和创建具体的windows应用程序。 提供了大可以工作的示例和练习,旨在帮助读者掌握编程技巧。 目录 第1章 使用visual c++ 2010编程 1 1.1 .net framework 1 1.2 clr 2 1.3 编写c++应用程序 3 1.4 学习windows编程 4 1.4.1 学习c++ 4 1.4.2 c++标准 5 1.4.3 属性 5 1.4.4 控制台应用程序 5 1.4.5 windows编程概念 6 1.5 集成开发环境简介 7 1.5.1 编辑器 8 1.5.2 编译器 8 1.5.3 链接器 8 1.5.4 库 8 1.6 使用ide 8 1.6.1 工具栏选项 9 1.6.2 可停靠的工具栏 10 1.6.3 文档 11 1.6.4 项目和解决方案 11 1.6.5 设置visual c++ 2010的选项 23 1.6.6 创建和执行windows应用程序 23 1.6.7 创建windows forms应用程序 26 1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变计算 29 2.1 c++程序结构 29 2.1.1 main()函数 36 2.1.2 程序语句 36 2.1.3 空白 38 2.1.4 语句块 38 2.1.5 自动生成的控制台程序 39 2.2 定义变 40 2.2.1 命名变 40 2.2.2 声明变 41 2.2.3 变的初始值 42 2.3 基本数据类型 42 2.3.1 整型变 43 2.3.2 字符数据类型 44 2.3.3 整型修饰符 45 2.3.4 布尔类型 46 2.3.5 浮点类型 46 2.3.6 字面值 47 2.3.7 定义数据类型的同义词 48 2.3.8 具有特定值集的变 49 2.4 基本的输入/输出操作 50 2.4.1 从键盘输入 50 2.4.2 到命令行的输出 50 2.4.3 格式化输出 51 2.4.4 转义序列 52 2.5 c++中的计算 54 2.5.1 赋值语句 54 2.5.2 算术运算 55 2.5.3 计算余数 59 2.5.4 修改变 60 2.5.5 增和减运算符 60 2.5.6 计算的顺序 63 2.6 类型转换和类型强制转换 64 2.6.1 赋值语句中的类型转换 65 2.6.2 显式类型转换 65 2.6.3 老式的类型强制转换 66 2.7 auto关键字 66 2.8 查看类型 67 2.9 按位运算符 67 2.9.1 按位and运算符 68 2.9.2 按位or运算符 69 2.9.3 按位eor运算符 71 2.9.4 按位not运算符 71 2.9.5 移位运算符 71 2.10 lvalue和rvalue 73 2.11 了解存储时间和作用域 74 2.11.1 自动变 74 2.11.2 决定变声明的位置 76 2.11.3 全局变 77 2.11.4 静态变 80 2.12 名称空间 80 2.12.1 声明名称空间 81 2.12.2 多个名称空间 82 2.13 c++/cli编程 84 2.13.1 c++/cli特有的基本数据类型 84 2.13.2 命令行上的c++/cli输出 87 2.13.3 c++/cli特有的功能—— 格式化输出 88 2.13.4 c++/cli的键盘输入 91 2.13.5 使用safe_cast 92 2.13.6 c++/cli枚举 92 2.14 查看c++/cli类型 96 2.15 小结 97 2.16 练习 97 2.17 本章主要内容 98 第3章 判断和循环 101 3.1 比较数据值 101 3.1.1 if语句 102 3.1.2 嵌套的if语句 104 3.1.3 嵌套的if-else语句 107 3.1.4 逻辑运算符和表达式 109 3.1.5 条件运算符 112 3.1.6 switch语句 113 3.1.7 无条件转移 116 3.2 重复执行语句块 117 3.2.1 循环的概念 117 3.2.2 for循环的变体 119 3.2.3 while循环 126 3.2.4 do-while循环 128 3.2.5 嵌套的循环 129 3.3 c++/cli编程 132 3.4 小结 137 3.5 练习 138 3.6 本章主要内容 138 第4章 数组、字符串和指针 139 4.1 处理多个相同类型的数据值 139 4.1.1 数组 140 4.1.2 声明数组 140 4.1.3 初始化数组 143 4.1.4 字符数组和字符串处理 144 4.1.5 多维数组 147 4.2 间接数据访问 150 4.2.1 指针的概念 150 4.2.2 声明指针 150 4.2.3 使用指针 152 4.2.4 初始化指针 152 4.2.5 sizeof操作符 158 4.2.6 常指针和指向常的指针 159 4.2.7 指针和数组 161 4.3 动态内存分配 168 4.3.1 堆的别名—— 空闲存储器 168 4.3.2 new和delete操作符 168 4.3.3 为数组动态分配内存 169 4.3.4 多维数组的动态分配 171 4.4 使用引用 172 4.4.1 引用的概念 172 4.4.2 声明并初始化lvalue引用 172 4.4.3 声明并初始化rvalue引用 173 4.5 字符串的本地c++库函数 174 4.5.1 查找以空字符结尾的字符串的长度 174 4.5.2 连接以空字符结尾的字符串 174 4.5.3 复制以空字符结尾的字符串 176 4.5.4 比较以空字符结尾的字符串 177 4.5.5 搜索以空字符结尾的字符串 177 4.6 c++/cli编程 179 4.6.1 跟踪句柄 180 4.6.2 clr数组 181 4.6.3 字符串 195 4.6.4 跟踪引用 203 4.6.5 内部指针 204 4.7 小结 206 4.8 练习 206 4.9 本章主要内容 207 第5章 程序结构(1) 209 5.1 理解函数 209 5.1.1 需要函数的原因 210 5.1.2 函数的结构 210 5.1.3 使用函数 213 5.2 给函数传递实参 216 5.2.1 按值传递机制 216 5.2.2 给函数传递指针实参 217 5.2.3 给函数传递数组 219 5.2.4 给函数传递引用实参 222 5.2.5 使用const修饰符 224 5.2.6 rvalue引用形参 225 5.2.7 main()函数的实参 227 5.2.8 接受数不定的函数实参 229 5.3 从函数返回值 231 5.3.1 返回指针 231 5.3.2 返回引用 233 5.3.3 函数中的静态变 236 5.4 递归函数调用 238 5.5 c++/cli编程 240 5.5.1 接受数可变实参的函数 241 5.5.2 main( )的实参 242 5.6 小结 243 5.7 练习 243 5.8 本章主要内容 244 第6章 程序结构(2) 245 6.1 函数指针 245 6.1.1 声明函数指针 246 6.1.2 函数指针作为实参 249 6.1.3 函数指针的数组 250 6.2 初始化函数形参 250 6.3 异常 252 6.3.1 抛出异常 253 6.3.2 捕获异常 254 6.3.3 mfc中的异常处理 255 6.4 处理内存分配错误 256 6.5 函数重载 257 6.5.1 函数重载的概念 258 6.5.2 引用类型和重载选择 260 6.5.3 何时重载函数 260 6.6 函数模板 261 6.7 使用decltype操作符 263 6.8 使用函数的示例 265 6.8.1 实现计算器 265 6.8.2 从字符串中删除空格 268 6.8.3 计算表达式的值 268 6.8.4 获得项值 270 6.8.5 分析数 271 6.8.6 整合程序 274 6.8.7 扩展程序 275 6.8.8 提取子字符串 277 6.8.9 运行修改过的程序 279 6.9 c++/cli编程 279 6.9.1 理解泛型函数 280 6.9.2 clr版本的计算器程序 285 6.10 小结 290 6.11 练习 291 6.12 本章主要内容 292 第7章 自定义数据类型 293 7.1 c++中的结构 293 7.1.1 结构的概念 294 7.1.2 定义结构 294 7.1.3 初始化结构 294 7.1.4 访问结构的成员 295 7.1.5 伴随结构的智能感知帮助 298 7.1.6 rect结构 299 7.1.7 使用指针处理结构 300 7.2 数据类型、对象、类和实例 301 7.2.1 类的起源 303 7.2.2 类的操作 303 7.2.3 术语 303 7.3 理解类 304 7.3.1 定义类 304 7.3.2 声明类的对象 305 7.3.3 访问类的数据成员 305 7.3.4 类的成员函数 307 7.3.5 成员函数定义的位置 309 7.3.6 内联函数 309 7.4 类构造函数 310 7.4.1 构造函数的概念 311 7.4.2 默认的构造函数 312 7.4.3 在类定义中指定默认的形参值 314 7.4.4 在构造函数中使用初始化列表 316 7.4.5 声明显式的构造函数 317 7.5 类的私有成员 318 7.5.1 访问私有类成员 320 7.5.2 类的友函数 321 7.5.3 默认复制构造函数 323 7.6 this指针 325 7.7 类的const对象 327 7.7.1 类的const成员函数 327 7.7.2 类外部的成员函数定义 328 7.8 类对象的数组 329 7.9 类的静态成员 331 7.9.1 类的静态数据成员 331 7.9.2 类的静态函数成员 334 7.10 类对象的指针和引用 334 7.10.1 类对象的指针 334 7.10.2 类对象的引用 337 7.11 c++/cli编程 338 7.11.1 定义值类类型 339 7.11.2 定义引用类类型 344 7.11.3 定义引用类类型的复制构造函数 346 7.11.4 类属性 346 7.11.5 initonly字段 358 7.11.6 静态构造函数 360 7.12 小结 360 7.13 练习 360 7.14 本章主要内容 361 第8章 深入理解类 363 8.1 类析构函数 363 8.1.1 析构函数的概念 363 8.1.2 默认的析构函数 364 8.1.3 析构函数与动态内存分配 366 8.2 实现复制构造函数 369 8.3 在变之间共享内存 370 8.3.1 定义联合 371 8.3.2 匿名联合 372 8.3.3 类和结构中的联合 372 8.4 运算符重载 373 …… 第9章 类继承和虚函数 第10章 标准模板库 第11章 调试技术 第12章 windows编程的概念 第13章 多核编程 第14章 使用mfc编写windows程序 第15章 处理菜单和工具栏 第16章 在窗口中绘图 第17章 创建文档和改进视图 第18章 使用对话框和控件 第19章 存储和打印文档 第20章 编写自己的dll
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值