C语言 传递带有指针的二维数组



我很难理解二维情况下数组表示法和指针表示法之间的关系。

对于1-D,函数oneDPrinterArr接受一个带有[]表示法的数组,并打印数组中的字符串。函数oneDPrinterPtr接受一个指向数组的指针,该数组没有[]表示法,但有一个*表示指针。这两个函数都可以工作。

然而,当我移动到2-D的情况下,如果我换出一个括号的星号,在情况下从twoDPrinterArr到twoDPrinterPtr,我得到一个错误expected ‘char **’ but argument is of type ‘char (*)[4]’

是否可以使用指针表示法来传递二维数组?

#include <stdio.h>
// 1
void oneDPrinterArr(char oneDArr[]){
printf("%s n", oneDArr);

}
// 2
void oneDPrinterPtr(char* oneDArr){
printf("%s n", oneDArr);

}

// 3
void twoDPrinterArr(char (twoDArr[][4])){

for(int i = 0; i <2; i++ ){
printf("%s n", twoDArr[i]);
}
}

// 4
void twoDPrinterPtr(char (*twoDArr[4])){

for(int i = 0; i <2; i++ ){
printf("%s n", twoDArr[i]);
}
}
int main()
{
char twoDArr[2][4];
twoDArr[0][0] = 'T';
twoDArr[0][1] = 'O';
twoDArr[0][2] = 'M';
twoDArr[0][3] = '';
twoDArr[1][0] = 'C';
twoDArr[1][1] = 'A';
twoDArr[1][2] = 'T';
twoDArr[1][3] = '';

twoDPrinterPtr(twoDArr);
oneDPrinterPtr(twoDArr[0]);
return 0;
}

之外的例子:

#include <stdio.h>
const int M = 3;


void print(int (*arr)[M])
{
int i, j;
for (i = 0; i < M; i++)
for (j = 0; j < M; j++)
printf("%d ", arr[i][j]);
}

int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
print(arr);
return 0;
}

有一个微妙的区别:

char (*twoDArr[4])
int  (*arr)   [M]

(括号)第一对不做任何事情——twoDArr是一个包含4个指向char的指针的数组。

第二个示例首先使arr成为指向M个int型数组的指针。由于M是一个变量(即使有const…),这是一个固定大小的VLA。这样会更有意义:

void print(int M, int (*arr)[M])

现在它可以处理不同的维度,如果调用者给出该值。

如果我把括号换成星号,

第一个空括号可以替换,但其他关键的维度不能替换。

另一种策略是指针数组。我甚至不确定术语是否100%清楚与"2D数组"。这就是你得到char **类型的地方;第一个dim.按指针(指向一行)移动,而不是直接按给定数量的元素移动。

2D数组可以使用指针。char **并不代表一个二维数组——它是一个指针指向指针的数组。这就是如何将一个2D char数组传递给函数printarray

void printarray( char (*array)[50], int SIZE )
#include <stdio.h>
void twoDPrinterPtr(char arr[][4] ,int row ,int col)
{
int i, j;
for (i = 0; i < row; i++){
for (j = 0; j < col; j++)
printf("%c ", arr[i][j]);
printf("n");
}
}

int main()
{
char twoDArr[2][4] = {{'T' , 'O', 'M', 'C',} , {'A' ,'T' , 'P' ,'S'}};
twoDPrinterPtr(twoDArr ,2 ,4);
return 0;
}