多維陣列 陣列指標 函式 變長陣列VLA

2021-08-28 15:03:45 字數 4001 閱讀 4100

#include

#define cls 2

#define row 2

//這三種形式等價

//int sum_2(int (*)[cls],int);

//int sum_2(int [cls],int);

intsum_2

(int a[

][cls]

,int n)

;//這三種形式等價

//int sum_3(int [cls][row],int);

//int sum_3(int (*)[cls][row],int);

intsum_3

(int a[

][cls]

[row]

,int n)

;int

main()

,,,}

;for

(int i=

0;i<

4;i++

)printf

("\n");

}for

(int i=

0;i<

4;i++

)printf

("\n");

}printf

("sum=%d\n"

,sum_2

(a,4))

;int

(*p)

[cls]

=a;//陣列指標 :p指向乙個含兩個int型別的陣列

/*p就是a[0]的首位址

*p+1(因為p的型別是兩個int型別的陣列)即+1等於跳過兩個int型別,即乙個a[0]大小的位址,此時p=a[1]的首位址。

*所以每次+1表示跳過兩個int型別的大小。

*/for

(int i=

0;i<

4;i++

)printf

("\n");

}for

(int i=

0;i<

4;i++

)printf

("\n");

}printf

("sum=%d\n"

,sum_2

(p,4))

;/*三維陣列

* 陣列b是含2個元素的陣列(二維陣列b[0],二維陣列b[1])。而每個元素,以b[0]為例,是乙個含2個元素(一維陣列b[0][0],一維陣列b[1][1])的陣列。而b[0][0][0]又是含兩個int型別元素的陣列

* b是陣列b的首位址,b+1表示的就是b中第二個元素(即二維陣列b[1])的位址

* 又因為b[1]是二維陣列的陣列名,二維陣列的陣列名是它的首位址,所以b[1]+1表示的是二維陣列b[1]第二個元素(即一維陣列b[1][1])的位址,即b[1][1]的位址

* 又因為b[1][1]是一維陣列的陣列名,一維陣列的陣列名是它的首位址,所以b[1][1]表示的是一維陣列b[1][1]的首位址,即b[1][1]=&a[1][1][0];

* 所以b[1][1]+1表示的就是一維陣列b[1][1]的第二個元素的位置,即b[1][1]+1=&b[1][1][1].

*/int b[2]

[cls]

[row]=,

},,}

};for(

int i=

0;i<

2;i++

)printf

("\n");

}printf

("}\n");

}printf

("sum=%d\n"

,sum_3

(b,2))

;int

(*p2)

[cls]

[row]

=b;for

(int i=

0;i<

2;i++

)printf

("\n");

}printf

("}\n");

}printf

("sum=%d\n"

,sum_3

(p2,2)

);}int

sum_2

(int a[

][cls]

,int n)

}return sum;

}int

sum_3

(int a[

][cls]

[row]

,int n)}}

return sum;

}

執行結果
1|1|1	2|2|2	

3|3|3 4|4|4

5|5|5 6|6|6

7|7|7 8|8|8

0x7ffcf8ca1660|0x7ffcf8ca1660|0x7ffcf8ca1660 0x7ffcf8ca1664|0x7ffcf8ca1664|0x7ffcf8ca1664

0x7ffcf8ca1668|0x7ffcf8ca1668|0x7ffcf8ca1668 0x7ffcf8ca166c|0x7ffcf8ca166c|0x7ffcf8ca166c

0x7ffcf8ca1670|0x7ffcf8ca1670|0x7ffcf8ca1670 0x7ffcf8ca1674|0x7ffcf8ca1674|0x7ffcf8ca1674

0x7ffcf8ca1678|0x7ffcf8ca1678|0x7ffcf8ca1678 0x7ffcf8ca167c|0x7ffcf8ca167c|0x7ffcf8ca167c

sum=36

1|1|1 2|2|2

3|3|3 4|4|4

5|5|5 6|6|6

7|7|7 8|8|8

0x7ffcf8ca1660|0x7ffcf8ca1660|0x7ffcf8ca1660 0x7ffcf8ca1664|0x7ffcf8ca1664|0x7ffcf8ca1664

0x7ffcf8ca1668|0x7ffcf8ca1668|0x7ffcf8ca1668 0x7ffcf8ca166c|0x7ffcf8ca166c|0x7ffcf8ca166c

0x7ffcf8ca1670|0x7ffcf8ca1670|0x7ffcf8ca1670 0x7ffcf8ca1674|0x7ffcf8ca1674|0x7ffcf8ca1674

0x7ffcf8ca1678|0x7ffcf8ca1678|0x7ffcf8ca1678 0x7ffcf8ca167c|0x7ffcf8ca167c|0x7ffcf8ca167c

sum=36

sum=36

sum=36

變長陣列
#include

//下面兩種函式原型等價

//int sum_2(int,int,int arr[*][*]);

intsum_2

(int rows,

int line,

int arr[rows]

[line]);

//arr是乙個變長陣列

//int sum_2(int arr[rows][line],int rows,int line); //錯誤,必須arr之後,因為arr的宣告需要row和line

intmain()

; //宣告乙個變長陣列,必須是auto類別,且不能在宣告中初始化它們

int arr1[a]

[b];

for(

int i=

0;i)for

(int j=

0;j) arr1[i]

[j]=i+j;

printf

("sum=%d\n"

,sum_2

(a,b,arr1));

return0;

}//並未實際建立陣列,當呼叫函式的時候,ar成為乙個指向陣列(含line個int 型別的值)的指標

intsum_2

(int rows,

int line,

int arr[rows]

[line])}

return sum;

}

執行結果

sum=4

指標 多維陣列 陣列指標 指標陣列

之前對陣列的概念一直沒有理解透徹,只覺得陣列名就是個常量指標而已,用法和基本的指標差不多。所以當我嘗試用二級指標去訪問二維陣列時,就經常會出錯。下面就是剛開始寫的乙個錯誤的程式 include int main int parray null parray iarray printf array 0...

多維陣列(陣列型別,陣列指標,陣列指標型別)

陣列 int myarray100 myarray是陣列首元素位址,myarray 1 步長是四個位元組 sizeof int myarray是整個陣列的位址,myarray 1 步長是100 sizeof int 400個位元組 typedef int myarraytype 100 myarra...

陣列和指標 指標和多維陣列

指標的值是它所指向物件的位址。位址的表示方式依賴於計算機內部的硬體。許多計算機都是按照位元組編址的,意思時記憶體中的每乙個位元組都按順序編號,這裡,乙個較大的位址通常是該物件的第乙個位元組的位址。因此,使用指標會更加的有效率,能夠很好的處理陣列,陣列表示法其實是在變相的使用指標。include st...