2d数组的三重指针的目的是什么?

时间:2015-08-29 18:01:55

标签: c pointers

                 // Triple Pointer Version       
     void init(char ***subjects_array, char***courses_array)
 {


     int i;

    *subjects_array = (char**) malloc (100 * sizeof(char*));
    *courses_array = (char**) malloc(100 * sizeof(char*));


    for(i = 0; i < INITIAL_COURSE_SIZE; i++)
   {
     (*subjects)[i] = (char*) malloc(4 * sizeof(char));
     (*courses)[i] = (char*) malloc(6 * sizeof(char));
   } 


  }  // end of Triple pointer version


                       //  Double Pointer Version
          void init(char** subject_array, char** courses_array) {                   

  subject_array = (char **) malloc (100*sizeof(char*));
  courses_array = (char **) malloc (100*sizeof(char*));

 for(int i = 0; i<100; i++){
    subject_array[i] = (char*) malloc(4*sizeof(char));
    courses_array[i] = (char*) malloc (6*sizeof(char));
   }
   }

我的问题是:两个版本都启动了一个二维数组。那么三指针版本的用途是什么?似乎额外的间接水平没有“目的”。

1 个答案:

答案 0 :(得分:1)

由于C仅通过值传递参数(包括指针),因此需要为要在函数内修改的任何参数添加额外的间接级别(即星号)。

这提供了正在发生的事情的线索:通常,您需要两个星号来表示2D数组,即char **twoD。但是,由于init分配了一个新数组,因此需要额外的间接级别,即

void init(char ***subjects_array, char***courses_array)

并将指针传递给调用者的2D数组:

char **subj, **courses;
init(&subj, &courses);

这也是init

中取消引用参数的原因
*subjects_array = (char**) malloc (100 * sizeof(char**));
//                                                  ^
//                                                  |
//       An asterisk was missing here --------------+

subjects_array前面的星号告诉编译器通过指针进行赋值,修改调用者传递给init的变量。