int *(*a)[3][4]和int **a[3][4]求sizeof(a)或sizeof(*a)或sizeof(**a)等的对比

本文详细解析了在32位机器环境下,不同类型的指针与数组的sizeof运算符结果,包括int*(*a)[3][4]与int**a[3][4]的区别,以及它们在不同维度上的大小计算。

问题描述

  1. int *(*a)[3][4],求sizeof(a)、sizeof(*a)、sizeof(**a)、sizeof(***a)、sizeof(****a)
  2. int **a[3][4],求sizeof(a)、sizeof(*a)、sizeof(**a)、sizeof(***a)、sizeof(****a)

Tips:在32位机器下运行的结果,指针占4个字节。
 


分析

问题1: int *(*a)[3][4]

[]的优先级高,所以这是一个3行4列的数组;
然后()的优先级高,所以(*a)是一个整体;
最左边剩下int*,是数组中元素的类型。
总结:a是一个指向二维指针数组的指针

  • sizeof(a) ,a是指针,它指向二维指针数组int* [3][4]。 占4字节
  • sizeof(*a),*a是二维指针数组 int* [3][4],3行4列数组存放int*类型数据。 占3行*4列*4字节=48字节(由于int*占4字节)
  • sizeof(**a),**a是一维指针数组 int* [][4],它指向二维指针数组的列。 占4列*4字节=16字节
  • sizeof(***a),***a是数组元素 int*占4字节
  • sizeof(****a),****a是整数 int占4字节

    由于指针大小为4字节,容易与int的4个字节搞混,所以下面将数据类型换成char。

问题1扩展 : char *(*a)[3][4]
  • sizeof(a) ,a是指针,它指向二维指针数组char* [3][4]。 占4字节
  • sizeof(*a),*a是二维指针数组 char* [3][4],3行4列数组存放char*类型数据。 占3行*4列*4字节=48字节(char*占4字节)
  • sizeof(**a),**a是一维指针数组 char* [][4],它指向二维指针数组的列。 占4列*4字节=16字节
  • sizeof(***a),***a是数组元素。 char* 占4字节
  • sizeof(****a),****a是字符 char占1字节

分析

问题2: int **a[3][4]

这是一个3行4列的数组,数组中的元素类型是int**。

  • sizeof(a) ,a是整型指针数组int** [3][4],存放着3行4列的char**元素。 3行*4列*4字节=48字节
  • sizeof(*a),*a是一维指针数组 int* [][4],它指向二维指针数组的列。 占4列*4字节=16字节
  • sizeof(**a),**a是数组元素 int**占4字节
  • sizeof(***a),***a是整型指针 int*占4字节
  • sizeof(****a),****a是整数 int占4字节
问题2扩展 : char **a[3][4]
  • sizeof(a) ,a是字符指针数组char** [3][4],存放着3行4列的char**元素。 3行*4列*4字节=48字节
  • sizeof(*a),*a是一维指针数组 char* [][4],它指向二维指针数组的列。 占4列*4字节=16字节
  • sizeof(**a),**a是数组元素 char**占4字节
  • sizeof(***a),***a是字符指针 char*占4字节
  • sizeof(****a),****a是字符 char占1字节

少了一对括号,结果差之甚远。


### 代码错误分析与修正 #### 1. 数组声明问题 在`main`函数中,`int a[m][m];`使用了未初始化的变量`m`来定义数组大小。在C语言里,数组大小必须是编译时常量,而`m`的值是运行时通过`scanf`获取的,这会引发编译错误。可以使用动态内存分配来解决此问题。 #### 2. 函数调用问题 在`main`函数中调用`flag`函数时,`flag(int a[][],int m);`写法有误,正确的调用应传递数组参数值。 #### 3. 函数参数声明问题 `flag`函数的参数`int a[][];`是不完整的二维数组声明,在C语言中,二维数组作为函数参数时,必须指定除第一维以外的其他维度大小。这里使用指针来处理动态分配的二维数组。 #### 4. 变量拼写错误 在`main`函数中使用了`flat`,正确的应该是`flag`函数的返回值;在`flag`函数中,`if(sum==0){ flat=1; }`也存在拼写错误,应该是`flag = 1;`。 #### 5. 变量作用域问题 在`flag`函数中,`sum`变量在`for`循环内部定义,在`if(sum==0)`判断时,`sum`已经超出了作用域。 以下是修正后的代码: ```c #include <stdio.h> #include <stdlib.h> // 函数声明,使用指针处理二维数组 int flag(int **a, int m); int main() { int i, n, m; int **a; // 读取n的值 scanf("%d", &n); for (i = 0; i < n; i++) { // 读取m的值 scanf("%d", &m); // 动态分配二维数组的内存 a = (int **)malloc(m * sizeof(int *)); for (int j = 0; j < m; j++) { a[j] = (int *)malloc(m * sizeof(int)); } // 读取数组元素 for (int j = 0; j < m; j++) { for (int k = 0; k < m; k++) { scanf("%d", &a[j][k]); } } // 调用flag函数 int result = flag(a, m); // 根据结果输出YESNO if (result == 1) { printf("YES\n"); } else { printf("NO\n"); } // 释放动态分配的内存 for (int j = 0; j < m; j++) { free(a[j]); } free(a); } return 0; } // 函数定义,判断数组是否满足条件 int flag(int **a, int m) { int flag = 0; int i, j; for (i = 1; i < m; i++) { int sum = 0; for (j = 0; j < i; j++) { sum += a[i][j]; } if (sum == 0) { flag = 1; } } return flag; } ``` ### `a = (int **)malloc(m * sizeof(int *));`的使用分析 - `a`是一个指向指针指针(`int **`),在C语言中,二维数组可以通过指针指针来模拟。 - `malloc`是标准库函数,用于动态分配内存。`m * sizeof(int *)`表示为`m`个指针分配内存,每个指针指向一个`int`类型的数组。 - `(int **)`是强制类型转换,将`malloc`返回的`void *`类型指针转换为`int **`类型。 这样,`a`就指向了一个包含`m`个指针数组,每个指针可以再指向一个`int`类型的数组,从而实现二维数组的动态分配。 ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值