1、指针数组
对于int *p1[5];
而言,因为[]
的优先级要比*
要高,所以p1
先与[]
结合,构成一个数组的定义,数组名为 p1。而int
修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向int
类型数据的指针,如下图所示,它是一个指针数组。
2、数组指针
对于语句int(*p2)[5]
,()
的优先级比[]
高,*
号和p2
构成一个指针的定义,指针变量名为p2
,而int
修饰的是数组的内容,即数组的每个元素。也就是说,p2
是一个指针,它指向一个包含 5 个int
类型数据的数组,如下图所示。很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。
int **findtwo(int **arr, int m, int n) {
int **res = (int **)malloc(sizeof(int *) * 2);
res[0] = (int *) malloc(sizeof(int) * 2);
res[1] = (int *) malloc(sizeof(int) * 2);
res[0][0] = arr[0][0];
res[0][1] = arr[0][1];
res[1][0] = arr[1][0];
res[1][1] = arr[1][1];
return res;
}
int main() {
int arr[][3] = {{1, 2, 3},
{4, 5, 6}};
int *p[2] = {arr[0], arr[1]};
int **res = findtwo(p, 2, 3);
printf("%d\n", res[0][0]);
printf("%d\n", res[0][1]);
printf("%d\n", res[1][0]);
printf("%d\n", res[1][1]);
}
/*
输出:
1
2
4
5
*/
3、二维数组传递
1、实参为二维数组名,形参为二维数组
void func(int n, char str[][5]) {
for (int i = 0; i < n; i++)
printf("str[%d] = %s\n", i, str[i]);
}
int main() {
char str[][5] = {"abc", "def", "ghi"};
func(3, str);
}
/*
输出:
str[0] = abc
str[1] = def
str[2] = ghi
*/
void printStr(int arr[][2], int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d\n", arr[i][j]);
}
}
}
int main() {
int arr[][2] = {{1, 2},
{3, 4},
{5, 6}};
printStr(arr, 3, 2);
}
/*
输出:
1
2
3
4
5
6
*/
2、实参为二维数组名,形参为数组指针
void func(int n, char (*str)[5]) {
for (int i = 0; i < n; i++)
printf("str[%d] = %s\n", i, str[i]);
}
int main() {
char str[][5] = {"abc", "def", "ghi"};
func(3, str);
}
/*
输出:
str[0] = abc
str[1] = def
str[2] = ghi
*/
void printStr(int (*arr)[2], int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d\n", arr[i][j]);
}
}
}
int main() {
int arr[][2] = {{1, 2},
{3, 4},
{5, 6}};
printStr(arr, 3, 2);
}
/*
输出:
1
2
3
4
5
6
*/
3、实参为指针数组,形参为指针的指针
void func(int n, char **str) {
for (int i = 0; i < n; i++)
printf("str[%d] = %s\n", i, str[i]);
}
int main() {
char str[][5] = {"abc", "def", "ghi"};
char *p[3]={str[0], str[1], str[2]};
func(3, p);
}
/*
输出:
str[0] = abc
str[1] = def
str[2] = ghi
*/
void printStr(int **arr, int m, int n) {
for (int i = 0; i < m; i++) {
for (int j=0; j<n; j++){
printf("%d\n", arr[i][j]);
}
}
}
int main() {
int arr[][2] = {{1, 2},
{3, 4},
{5, 6}};
int *p[3]={arr[0], arr[1], arr[2]};
printStr(p, 3, 2);
}
/*
输出:
1
2
3
4
5
6
*/
4、实参为指针数组,形参为指针数组
void printStr(char *str[], int n) {
for (int k = 0; k < n; k++) {
printf("%s\n", str[k]);
}
}
int main() {
char str[][5] = {"abc", "def", "ghi"};
char *pstr[3] = {str[0], str[1], str[2]};
printStr(pstr, 3);
return 0;
}
/*
输出:
str[0] = abc
str[1] = def
str[2] = ghi
*/
void printStr(int *arr[3], int m, int n) {
for (int i = 0; i < m; i++) {
for (int j=0; j<n; j++){
printf("%d\n", arr[i][j]);
}
}
}
int main() {
int arr[][2] = {{1, 2},
{3, 4},
{5, 6}};
int *p[3]={arr[0], arr[1], arr[2]};
printStr(p, 3, 2);
}
/*
输出:
1
2
3
4
5
6
*/