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

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

文章目录

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

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





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


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


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


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


 

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


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


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


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


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



代码示例 :


#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;
}



执行结果 :

image.png







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


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


 

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


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


array[2]


相当于


*(array + 2)

由此可以看出 , array 的每个 跳转步长 是 10 1010 字节 , array + 2 相当于跳了 20 2020 字节 , 才能访问到第 3 33 个元素 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月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
45 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
1月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
84 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
1月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
54 9
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
45 7
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
63 6
|
1月前
|
存储 算法 安全
C 语言中的位运算:挖掘底层计算的高效力量
位运算是C语言中直接操作二进制位的一种技术,能高效处理底层数据,广泛应用于优化算法、硬件编程等领域,是掌握C语言高级特性的关键之一。
|
2月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
51 6
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
151 13