文章目录
一、二维数组内存大小计算
二、二维数组内存大小意义
一、二维数组内存大小计算
给定一个二维数组 : 该 二维数组 中有 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; }
执行结果 :
二、二维数组内存大小意义
编译器操作 二维数组 时 , 只关心 二维数组 的整体内存结构 , 下面的二维数组 有 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; }