我可以将指针用于一维数组的函数,但我不知道对二维数组使用相同的技术。
这是我的示例代码:
int main(){
int b[10]; //initialize b
Print(b);
int a[10][10]; //initialize a
Print2(a);
}
void Print(int*b){
for(int i=0; i<10; i++)
printf("%d\n",*(b+i));
}
// I want to use same technique here
// but i have met error
void Print2(int*a){
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
printf("%d\n",*(*(a+i)+j)); // error at this line
}
请帮助我如何对二维数组使用相同的一维数组技术。
谢谢:)
答案 0 :(得分:1)
摧毁内部*并用10乘以i然后加上j
printf("%d\n",*((a+i*10)+j));
因为在2d矩阵中“向下”,所以你会经历维度-1(在这个例子中为10)元素。
for 3d:
printf("%d\n",*(a+i*100+j*10+k));
表示N维:
*(a+i*(size of i-dimension)+j*(size of j dim)+......+last index)
答案 1 :(得分:1)
我发现这种粘贴非常有用,称为“阵列衰减”。检查每个示例行上方的注释类型。
答案 2 :(得分:1)
b
是一个int数组,因此它的第一个元素是int
。当b
衰减到指向其第一个元素的指针时,结果为int*
(这就是Print
函数接受的内容。)
a
是一个数组数组,因此它的第一个元素是一个数组。当a
衰减到指向其第一个元素的指针时,结果就是指向10-int数组的指针:
void Print2(int (*a)[10] ){ // pointer-to-array type
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
printf("%d\n",a[i][j]);
}
多维数组只能让你在C中到目前为止,因为当你传递它们时,只有第一个维度是可变的。其余维度需要在编译时知道,因为它们是指针类型的一部分。如果你需要在多个维度上变量的东西,你可以像在tuğrulbüyükışık的答案中“扁平”它并使用一维数组。
答案 3 :(得分:1)
问题是,数组衰减到指针,但是一个二维数组衰减到指向特定大小数组的指针。
#include "stdio.h"
void print(int *arr);
void print2D(int (*arr)[]);
int main() {
int data[5] = {1, 2, 3, 4, 5};
print(data);
int data2D[5][5];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
data2D[i][j] = (i + 1) * 10 + (j + 1);
}
}
print2D(data2D);
}
void print(int *arr) {
for (int i = 0; i < 5; i++) {
printf("%d\n", arr[i]);
}
}
void print2D(int (*arr)[5]) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%d\n", arr[i][j]);
}
}
}
在这里,正如您所看到的,我在二维函数中声明了数组作为指向5个元素数组的指针。现在,当我增加i
时,编译器知道我想要跳过五个元素。你可以run this example at Ideone。
当然,你可以手动完成。在这种情况下,您必须自己计算地址。在这种情况下,函数将如下所示:
void print2D(int *arr) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%d\n", *(arr + (i * 5) + j));
}
}
}
你必须这样称呼它:
print2D(data2D[0]);
答案 4 :(得分:1)
#include <stdio.h>
void Print(int*b)
{
int i;
for(i=0; i<10; i++)
printf("%d\n",*(b+i));
}
void Print2(int*a)
{
int i,j;
for( i=0; i<10; i++)
{
printf("\n");
for(j=0; j<10; j++)
printf("%d\t",*(a+(i*10)+j)); // Modification done here.
}
}
int main()
{
int b[10]; //initialize b
Print(b);
int a[10][10] = {}; //initialize a 0
Print2((int*)a);
return 0;
}
我修改了Print2()。
添加(1D数组的大小*要访问哪个1D数组(i))+ 1D数组(j)中的特定元素到数组的基址。