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

問題描述

  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字節

少了一對括號,結果差之甚遠。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章