从 C 中的另一个函数访问二维数组
Access 2D array from another function in C
我可以在声明数组的函数中使用指针概念访问数组。但是,我无法从另一个引发错误的函数进行访问:indirection requires pointer operand ('int' invalid)。代码是:
#include <stdio.h>
const int ROW = 3;
const int COL = 3;
void printArray(int *ptr);
int main(void)
{
int arr[ROW][COL];
int count = 2;
// initialize 2D array
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
arr[i][j] = count++;
}
}
// print 2D array
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
// printf("%i\t", arr[i][j]); // using array
printf("%i\t", *(*(arr + i) + j)); // using pointer
}
printf("\n");
}
printf("\n---------printing using function------------\n");
printArray(&arr[0][0]);
}
void printArray(int *ptr)
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%i\t", *(*(ptr + i) + j)); // not working as expected
}
printf("\n");
}
}
我该如何解决这个问题?有什么想法吗?
*(*(ptr + i) + j)
用两个间接级别取消引用指针,这是不可能的,因为它只有一个,是 int*
.
一般来说,避免使用疯狂的指针算术表达式,而是使用可读的数组索引:ptr[i + j]
。虽然你的计算也有误,但应该是ptr[i*COL + j]
虽然上面提到的是“损坏的二维数组”并且是正确的,但是有点陈旧的 C。通过使用现代 C 编程中所做的可变长度数组 (VLA) 的指针,我们可以大大改变代码更具可读性:
#include <stdio.h>
const int ROW = 3;
const int COL = 3;
void printArray(size_t row, size_t col, int array[row][col]);
int main(void)
{
int arr[ROW][COL];
int count = 2;
// initialize 2D array
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
arr[i][j] = count++;
}
}
// print 2D array
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
// printf("%i\t", arr[i][j]); // using array
printf("%i\t", *(*(arr + i) + j)); // using pointer
}
printf("\n");
}
printf("\n---------printing using function------------\n");
printArray(ROW, COL, arr);
}
void printArray(size_t row, size_t col, int array[row][col])
{
for (size_t i = 0; i < row; i++)
{
for (size_t j = 0; j < col; j++)
{
printf("%i\t", array[i][j]);
}
printf("\n");
}
}
对于初学者,请注意 C 中的这些声明
const int ROW = 3;
const int COL = 3;
不声明整型常量。所以你的程序处理的是可变长度数组。
如果你想定义整数常量,你可以这样写
enum { ROW = 3, COL = 3 };
尽管如此,还是按以下方式声明和定义函数
void printArray( int ( *ptr )[COL], int row );
和
void printArray( int ( *ptr )[COL], int row )
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%i\t", *(*(ptr + i) + j));
}
printf("\n");
}
}
并这样称呼它
printArray( arr, ROW );
或者,如果使用您的声明,那么函数定义将如下所示
void printArray(int *ptr)
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%i\t", *( ptr + i * COL + j ) );
}
printf("\n");
}
}
我可以在声明数组的函数中使用指针概念访问数组。但是,我无法从另一个引发错误的函数进行访问:indirection requires pointer operand ('int' invalid)。代码是:
#include <stdio.h>
const int ROW = 3;
const int COL = 3;
void printArray(int *ptr);
int main(void)
{
int arr[ROW][COL];
int count = 2;
// initialize 2D array
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
arr[i][j] = count++;
}
}
// print 2D array
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
// printf("%i\t", arr[i][j]); // using array
printf("%i\t", *(*(arr + i) + j)); // using pointer
}
printf("\n");
}
printf("\n---------printing using function------------\n");
printArray(&arr[0][0]);
}
void printArray(int *ptr)
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%i\t", *(*(ptr + i) + j)); // not working as expected
}
printf("\n");
}
}
我该如何解决这个问题?有什么想法吗?
*(*(ptr + i) + j)
用两个间接级别取消引用指针,这是不可能的,因为它只有一个,是 int*
.
一般来说,避免使用疯狂的指针算术表达式,而是使用可读的数组索引:ptr[i + j]
。虽然你的计算也有误,但应该是ptr[i*COL + j]
虽然上面提到的是“损坏的二维数组”并且是正确的,但是有点陈旧的 C。通过使用现代 C 编程中所做的可变长度数组 (VLA) 的指针,我们可以大大改变代码更具可读性:
#include <stdio.h>
const int ROW = 3;
const int COL = 3;
void printArray(size_t row, size_t col, int array[row][col]);
int main(void)
{
int arr[ROW][COL];
int count = 2;
// initialize 2D array
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
arr[i][j] = count++;
}
}
// print 2D array
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
// printf("%i\t", arr[i][j]); // using array
printf("%i\t", *(*(arr + i) + j)); // using pointer
}
printf("\n");
}
printf("\n---------printing using function------------\n");
printArray(ROW, COL, arr);
}
void printArray(size_t row, size_t col, int array[row][col])
{
for (size_t i = 0; i < row; i++)
{
for (size_t j = 0; j < col; j++)
{
printf("%i\t", array[i][j]);
}
printf("\n");
}
}
对于初学者,请注意 C 中的这些声明
const int ROW = 3;
const int COL = 3;
不声明整型常量。所以你的程序处理的是可变长度数组。
如果你想定义整数常量,你可以这样写
enum { ROW = 3, COL = 3 };
尽管如此,还是按以下方式声明和定义函数
void printArray( int ( *ptr )[COL], int row );
和
void printArray( int ( *ptr )[COL], int row )
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%i\t", *(*(ptr + i) + j));
}
printf("\n");
}
}
并这样称呼它
printArray( arr, ROW );
或者,如果使用您的声明,那么函数定义将如下所示
void printArray(int *ptr)
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%i\t", *( ptr + i * COL + j ) );
}
printf("\n");
}
}