我刚刚遇到过处理多维数组的程序。虽然我有它的摇摆,但有一个我不确定的特殊符号。
我们的想法是将指针传递给多维数组的列,因为2-Dim数组不需要您提及2D矩阵中的行数。因此,指向2D矩阵列的指针pm将传递为:int (*pm)[COLUMN]
这是完整的程序:
#include<stdio.h>
#include<stdlib.h>
const int ROW = 2;
const int COL=3;
void fill_array(int (*pm)[COL], int row);
void display_array(int m[][COL], int row);
int main(int argc, char const *argv[])
{
/* code */
int i,j;
int m[ROW][COL];
//CALL function to enter elements
fill_array(m,ROW);
//display
display_array(m,ROW);
return 0;
}
void fill_array(int (*pm)[COL], int row)
{
int i,j;
printf("Please fill the array's content: \n");
for(i=0;i<row;i++)
{
for(j=0;j<COL;j++)
{
printf("\n m[%d][%d]: ",i,j);
scanf("%d", &pm[i][j]);
}
}
}
void display_array(int m[][COL], int row)
{
int i,j;
printf("\n Array's contents: \n");
for(i=0;i<row;i++)
{
for(j=0;j<COL;j++)
{
printf("%d\t", m[i][j]);
}
printf("\n");
}
}
我不确定指向数组的指针的表示。我的意思是我不熟悉指针只是附加到数组的符号。有人可以对此有所了解吗?
非常感谢!
答案 0 :(得分:2)
当数组通过值传递给函数时,它将转换为指向其第一个元素的指针。根据C标准(6.3.2.1 Lvalues,数组和函数指示符)
3除非它是sizeof运算符或一元&amp;的操作数。 operator,或者是用于初始化数组的字符串文字,a 具有类型''数组类型''的表达式将转换为 带有''指向类型'的指针的表达式,指向初始值 数组对象的元素,而不是左值。如果是数组对象 具有寄存器存储类,行为未定义。
如果您传递此数组
int m[ROW][COL];
到一个函数,它被转换为指向第一个元素的指针,而第一个元素又是int[COL]
类型的数组。指向此数组的指针将类似于
int ( * )[COL]
如果您将取消引用此指针,您将获得类型为int[COL]
例如,如果您声明指向一维数组的指针,如
int ( *pm )[COL]
然后表达
*pm
的类型为int[COL]
表达式*pm
等同于pm[0]
由于pm[0]
是一个数组,因此您可以再次应用下标运算符pm[0][0]
并获取类型{的第一个元素{2}}二维范围。
答案 1 :(得分:1)
作为函数的参数,int m[][COL]
等同于int (*m)[COL]
,同样int v[]
等同于int *v
。在这两种情况下,m
都被视为指向大小为COL
的整数数组的指针。
重要的一点是,*m
(解除引用m
)会为您提供第一个数组(就像*v
为您提供该向量中的第一个元素)。 m
上的指针算法按预期工作,例如*(m+1)
为您提供第二个数组。因此,您可以将m
索引为函数内部的二维数组(m[i][j]
)。
答案 2 :(得分:-1)
我仍然是C的新手,但我相信它是一个指针数组的指针。我知道如何制作动态二维数组的唯一方法就是这样。
答案 3 :(得分:-1)
好吧,如果我可以说真实的事实是在C / C ++中没有比在内存中分配连续空间更多的数组。有一个指针指向分配的内存块的开头。在这种情况下,如果你有[10] int元素的数组,分配的空间大约是sizeof(int)* 10,指针指向第一个元素。因此,您可以轻松地增加++和减少 - 移动。
对于维数组,很容易将指针传递给它们的第一个元素并逐渐增加到列。但是,您可以使用单个指针轻松处理数组[2] [3]。您只需要乘以2 * 3即可捕获整个分配的内存块。