【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语言 之 内存函数
35 3
|
7天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
49 12
|
4天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
28天前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
38 3
|
1月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
1月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
1月前
|
编译器 程序员 C语言
深入C语言:动态内存管理魔法
深入C语言:动态内存管理魔法
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
30天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
25 0
|
1月前
|
C语言
保姆级教学 - C语言 之 动态内存管理
保姆级教学 - C语言 之 动态内存管理
20 0
下一篇
无影云桌面