// 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));
}
}
我的问题是:两个版本都启动了一个二维数组。那么三指针版本的用途是什么?似乎额外的间接水平没有“目的”。
答案 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
的变量。