如果不想复制数组,只需要在结构体中获取指向该数组的指针(注意:如果给
*pointer
赋值,则结构体中的数组内容将会被更改),有两种方法可以实现这个目标:
#include <stdio.h>
typedef struct node
{
int grid[3][3];
} Node;
void someFunction1(Node *node) {
int i, j;
int (*grid)[3] = node->grid;
for(i=0; i<3; i++){
for(j=0; j<3; j++){
printf("%d ", grid[i][j]);
}
printf("\n");
}
}
void someFunction2(Node *node) {
int i, j;
int *grid = (int*) node->grid;
for(i=0; i<3; i++){
for(j=0; j<3; j++){
printf("%d ", grid[i*3+j]);
}
printf("\n");
}
}
int main()
{
Node t;
int i, *p;
for(i=0, p=(int*)t.grid; i<9; p++, i++){
*p = i;
}
printf("Function1:\n");
someFunction1(&t);
printf("Function2:\n");
someFunction2(&t);
return 0;
}
以上代码展示了一个使用指针的简单函数。它们都是安全且符合标准的。
如果要使用指向指针的指针,int**
,您需要以不同的方式进行处理,因为数组是在内存中的线性存储(所以上述代码可以使用int*
指向数组的开头并对其进行操作),但int**
不行。
编辑
所以这里来了someFunction3()
void someFunction3(Node *node)
{
int i, j;
int **p;
p = malloc(sizeof(int)*3);
for(i=0; i<3; i++) {
p[i] = (int*) node->grid[i];
}
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
printf("%d ", p[i][j]);
}
printf("\n");
}
free(p);
}