【C 语言】二级指针作为输入 ( 二维数组 | 二维数组内存大小计算 | 指针跳转步长问题 )

举报
韩曙亮 发表于 2022/01/14 00:31:27 2022/01/14
【摘要】 文章目录 一、二维数组内存大小计算二、二维数组内存大小意义 一、二维数组内存大小计算 给定一个二维数组 : 该 二维数组 中有 ...





一、二维数组内存大小计算



给定一个二维数组 : 该 二维数组 中有 4 4 4 个 一维数组 , 每个一维数组有 10 10 10char 数据 ;

    // I. 二维数组
    char array[4][10] = {"abc", "123", "258", "sfd"};

  
 
  • 1
  • 2

计算二维数组大小 : 40 40 40 字节 ;

    // 求二维数组总的内存大小
    int array_len = sizeof(array);

  
 
  • 1
  • 2

计算一维数组大小 : 该 二维数组 中有 4 4 4 个 一维数组 , 每个一维数组有 10 10 10 字节 ;

    // 求二维数组中的一位数组的内存大小
    int array_0_len = sizeof(array[0]);

  
 
  • 1
  • 2

计算二维数组中有多少个一维数组 : 4 4 4 个 ;

    // 求二维数组中一维数组个数
    int len = sizeof(array) / sizeof(array[0]);

  
 
  • 1
  • 2

代码示例 :

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

int main()
{
    // 循环控制变量
    int i = 0, j = 0;
    // 二维数组中的一维数组个数
    int num = 4;

    // 排序时 , 交换指针变量时的临时变量 , 存储指针指向的内存所存储的数据
    char tmp[10];

    // I. 二维数组
    char array[4][10] = {"abc", "123", "258", "sfd"};

    // 求二维数组总的内存大小
    int array_len = sizeof(array);

    // 求二维数组中的一位数组的内存大小
    int array_0_len = sizeof(array[0]);

    // 求二维数组中一维数组个数
    int len = sizeof(array) / sizeof(array[0]);

    // 打印上述大小
    printf("array_len = %d, array_0_len = %d, len = %d\n", array_len, array_0_len, len);

    // 命令行不要退出
    system("pause");
    return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

执行结果 :

在这里插入图片描述





二、二维数组内存大小意义



编译器操作 二维数组 时 , 只关心 二维数组 的整体内存结构 , 下面的二维数组 有 4 4 4 10 10 10 列 ;

    // I. 二维数组
    char array[4][10] = {"abc", "123", "258", "sfd"};

  
 
  • 1
  • 2

当使用数组下标进行遍历时 ,

array[2]

  
 
  • 1

相当于

*(array + 2)

  
 
  • 1

由此可以看出 , array 的每个 跳转步长 是 10 10 10 字节 , array + 2 相当于跳了 20 20 20 字节 , 才能访问到第 3 3 3 个元素 array[2] ;


正是由于 上述 跳转步长 的问题 , 在函数中 , 形参 必须是 二维数组 , 不能是 二维指针 ;

/*
 * 此处遍历时 , 注意指针的步长 ,
 * 传入一个二级指针 char ** , 会出错
 * 如果传入 二级指针 ,
 * array[i] 等同于 *(array + i)
 * array 的步长是 10
 */
int print_str(char array[4][10], int num)
{
    // 循环控制变量
    int i = 0;

    // 判断指针合法性
    if(array == NULL)
    {
        printf("array == NULL\n");
        return -1;
    }

    // 打印二维数组中的字符串
    for(i = 0; i < num; i++)
    {
        // 使用数组下标形式访问
        printf("%s\n", array[i]);
        // 使用指针访问
        //printf("%s\n", *(array + i));
    }

    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/121569090

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。