从零开始学C语言系列之第八章《函数和多维数组》

往期回顾

1.【第一章】《认识C语言》
2.【第二章】C语言概述及基本知识1
3.【第二章】C语言概述及基本知识2
4.【第三章】字符串和格式化输入/ 输出
5.【第三章】 printf
6.【第三章】 scanf
7.【第三章】 putchar
8.【第三章】 getchar
9.【第三章】 sizeof
10.【第三章】 strlen
11.【第三章】 define
12.【第四章】运算符第一节
13.【第四章】运算符第二节
14.【第四章】运算符第三节
15.【第四章】运算符第四节
16.【第四章】类型转换
17.【第四章】函数与转化
18.【第五章】while
19.【第五章】for开篇
20.【第五章】for的灵活性
21.【第五章】逗号运算符
22.【第五章】do while
23.【第五章】循环选择
24.【第六章】if
25.【第六章】else if
26.【第六章】break
27.【第六章】continue
28.【第六章】break和continue的区别与作用
29.【第六章】switch
30.【第七章】函数复习
31.【第七章】函数参数
32.【第七章】函数中返回值
33.【第七章】递归
34.【第七章】指针引入
35.【第七章】指针简介
36.【第七章】指针简介2
37.【第八章】数组
38.【第八章】数组2
39.【第八章】多维数组
40.【第八章】指针与数组
41.【第八章】函数 数组 与指针
42.【第八章】使用指针形参
43.【第八章】指针操作
44.【第八章】const入门
45.【第八章】const 与指针
46.【第八章】指针和多维数组原理
47.【第八章】指向多维数组的指针


文章目录


  如果要编写处理二维数组的函数,首先要能正确地理解指针才能写出声明函数的形参。在函数体中,通常使用数组表示法进行相关操作。

void somefunction(int(*pt)[4]);

或者

void somefunction(int pt[][4]);

例子:

#include <stdio.h>
#define ROWS 3
#define COLS 4
void sum_rows(int ar[][COLS], int rows);
void sum_cols(int [][COLS], int );    
int sum2d(int (*ar)[COLS], int rows); 
int main(void)
{
    int junk[ROWS][COLS] = {
        {2,4,6,8},
        {3,5,7,9},
        {12,10,8,6}
    };
    
    sum_rows(junk, ROWS);
    sum_cols(junk, ROWS);
    printf("Sum of all elements = %d\n", sum2d(junk, ROWS));
    
    return 0;
}

void sum_rows(int ar[][COLS], int rows)
{
    int r;
    int c;
    int tot;
    
    for (r = 0; r < rows; r++)
    {
        tot = 0;
        for (c = 0; c < COLS; c++)
            tot += ar[r][c];
        printf("row %d: sum = %d\n", r, tot);
    }
}

void sum_cols(int ar[][COLS], int rows)
{
    int r;
    int c;
    int tot;
    
    for (c = 0; c < COLS; c++)
    {
        tot = 0;
        for (r = 0; r < rows; r++)
            tot += ar[r][c];
        printf("col %d: sum = %d\n", c, tot);
    }
}

int sum2d(int ar[][COLS], int rows)
{
    int r;
    int c;
    int tot = 0;
    
    for (r = 0; r < rows; r++)
        for (c = 0; c < COLS; c++)
            tot += ar[r][c];
    
    return tot;
}

在这里插入图片描述
注意,下面的声明不正确:

int sum2(int ar[][]int rows);//错误的声明

​   前面介绍过,编译器会把数组表示法转换成指针表示法。例如,编译器会把 ar[1]转换成 ar+1。编译器对 ar+1 求值,要知道 ar所指向的对象大小。下面的声明:

int sum2(int ar[][4],int rows);//有效声明

​   表示 ar 指向一个内含4个 int 类型值的数组(在我们的系统中,ar指向的对象占 16字节),所以ar+1的意思是“该地址加上16字节”。如果第2对方括号是空的,编译器就不知道该怎样处理。

不过初学还是建议直接这有写,比较清晰

int sum2(int ar[3][4]int rows);//有效声明,但是3将被忽略

一般而言,声明一个指向N维数组的指针时,只能省略最左边方括号中的值:

int sum4d(int ar[][12][20][30],int rows);

  因为第1对方括号只用于表明这是一个指针,而其他的方括号则用于描述指针所指向数据对象的类型。下面的声明与该声明等价:

    这里,ar 指向一个12x20x30的int 数组

int sum4d(int(*ar)[12][20][30]int rows);// ar是一个指针

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 20:10:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 20:10:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 20:10:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 20:10:03       20 阅读

热门阅读

  1. 【进程池与线程池 协程】

    2024-06-08 20:10:03       6 阅读
  2. Linux c fread/fseek 函数

    2024-06-08 20:10:03       11 阅读
  3. clickhouse去重复数据解决方案

    2024-06-08 20:10:03       11 阅读
  4. 零基础入门学习Python第二阶05MySQL详解01

    2024-06-08 20:10:03       13 阅读
  5. 360数字安全:2024年1月勒索软件流行态势分析报告

    2024-06-08 20:10:03       11 阅读
  6. 【名词解释】Unity中的Toggle组件及其使用示例

    2024-06-08 20:10:03       8 阅读
  7. mac m1使用docker安装mysql5.7,并且开启binlog

    2024-06-08 20:10:03       9 阅读
  8. 代码随想录35期总结

    2024-06-08 20:10:03       12 阅读