tam*_*nur 1 c pointers function multidimensional-array function-definition
我可以在声明数组的函数中使用指针概念访问数组。但是,我无法从另一个抛出错误的函数访问:indirection requires pointer operation ('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");
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?任何的想法?
*(*(ptr + i) + j)取消引用具有两个间接级别的指针,这是不可能的,因为它只有一个,即int*.
一般来说,从疯狂的指针算术表达式副歌,并使用读取的数组索引来代替:ptr[i + j]。虽然你的计算也是错误的,但应该是ptr[i*COL + j]
虽然以上被称为“错位的 2D 数组”并且是正确的,但有点陈旧的 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");
}
}
Run Code Online (Sandbox Code Playgroud)