[英]C : Pointer for two dimension array
我可以將指針用於一維數組以實現功能,但是我不知道對二維數組使用相同的技術。
這是我的示例代碼:
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
}
請幫助我如何將一維數組的相同技術用於二維數組。
謝謝 :)
銷毀內部*並將i乘以10,然后加j
printf("%d\n",*((a+i*10)+j));
因為要在2D矩陣中“向下”移動,所以您要經過維度1(在此示例中為10)元素。
3d:
printf("%d\n",*(a+i*100+j*10+k));
對於N維:
*(a+i*(size of i-dimension)+j*(size of j dim)+......+last index)
我發現此粘貼非常有用,稱為“數組衰減”。 檢查每個示例行上方的注釋的類型。
b
是一個整數數組,因此它的第一個元素是一個int
。 當b
衰減到指向其第一個元素的指針時,結果就是int*
(這就是您的Print
函數所接受的)。
a
是一個數組數組,因此它的第一個元素是一個數組。 當a
衰變到一個指針到它的第一元件,其結果因此是一個指針到陣列的-10-整數:
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的答案將其“展平”,並使用一維數組。
問題是,數組衰減到指針,但是二維數組衰減到指向特定大小的數組的指針。
#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]);
}
}
}
如您所見,在這里,我將二維函數中的array聲明為指向5個元素的數組的指針。 現在,當我增加i
,編譯器知道我要跳過五個元素。 您可以在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]);
#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()。
將(一維數組的大小*要訪問的一維數組(i))+一維數組(j)中的特定元素添加到數組的基址中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.