這是在 C 編程語言中定義指向陣列的指標陣列的正確方法嗎?
int* ptr[2];
int n1[5] = { 2,3,4,5,6 };
int n2[5] = { 2,3,4,5,6 };
ptr[0] = &n1;
ptr[1] = &n2;
我收到如下錯誤:
epi_2.c:20:12: warning: incompatible pointer types assigning to 'int *' from 'int (*)[5]' [-Wincompatible-pointer-types]
ptr[1] = &n2;
uj5u.com熱心網友回復:
你必須寫
ptr[0] = n1;
ptr[1] = n2;
運算式中使用的陣列指示符(很少有例外)被轉換為指向其第一個元素的指標。
那是在上面的陳述句運算式中n1
,并且n2
具有型別int *
- 左側運算式的型別。
至于這些說法
ptr[0] = &n1;
ptr[1] = &n2;
那么右側運算式的型別與左側運算式的int ( * )[5]
型別不兼容int *
。所以編譯器發出訊息。
否則,您需要宣告指標陣列,例如
int ( * ptr[2] )[5];
//...
ptr[0] = &n1;
ptr[1] = &n2;
這是一個演示程式。
#include <stdio.h>
int main( void )
{
int* ptr[2];
int n1[5] = { 2,3,4,5,6 };
int n2[5] = { 2,3,4,5,6 };
ptr[0] = n1;
ptr[1] = n2;
for ( size_t i = 0; i < 2; i )
{
for ( size_t j = 0; j < 5; j )
{
printf( "%d ", ptr[i][j] );
}
putchar( '\n' );
}
}
程式輸出為
2 3 4 5 6
2 3 4 5 6
這是另一個演示程式。
#include <stdio.h>
int main( void )
{
int ( * ptr[2] )[5];
int n1[5] = { 2,3,4,5,6 };
int n2[5] = { 2,3,4,5,6 };
ptr[0] = &n1;
ptr[1] = &n2;
for ( size_t i = 0; i < 2; i )
{
for ( size_t j = 0; j < 5; j )
{
printf( "%d ", ( *ptr[i] )[j] );
}
putchar( '\n' );
}
}
程式輸出與上圖相同
2 3 4 5 6
2 3 4 5 6
uj5u.com熱心網友回復:
這是定義指向陣列的指標陣列的正確方法嗎?
&n1
確實回傳一個指向陣列的指標。
但ptr[0]
不是指向陣列的指標。它是一個指向int
.
你有兩個選擇。
更改ptr[0]
為指向陣列的指標
通過使用以下內容,ptr
成為指向 5 個整數陣列的指標陣列。
int ( *ptr[2] )[5] = { &n1, &n2 };
更改&1n
為回傳指標的內容int
但是我們很少處理指向陣列的指標。我們通常使用指向陣列第一個元素的指標。
int *ptr[2] = { &( n1[0] ), &( n2[0] ) };
因為陣列退化為指向其第一個元素的指標,所以以下是等效的但更短:
int *ptr[2] = { n1, n2 };
在這兩種情況下,您最終都會得到一個指向同一地址的指標。但是指標的型別不同。關于唯一的區別是sizeof( *ptr[0] )
會有所不同。
#include <stdio.h>
int main( void ) {
int ( *ptrA[2] )[5];
int *ptrB[2];
printf( "%zu\n", sizeof( *ptrA[0] ) ); // 20, size of array of 5 `int`.
printf( "%zu\n", sizeof( *ptrB[0] ) ); // 4, size of one `int`.
}
uj5u.com熱心網友回復:
在 C 中,有兩種指向陣列的指標:
- 指向陣列第一個元素的指標。
- 指向整個陣列的指標。
如果你有一個陣列
int arr[5] = { 2,3,4,5,6 };
然后您可以通過以下方式創建指向陣列第一個元素的指標:
int *ptr = arr;
在上面的行中,運算式arr
將自動衰減到&arr[0]
,即指向陣列第一個元素的指標。
您可以通過以下方式創建指向整個陣列的指標:
int (*ptr)[5] = &arr;
在 C 語言中,使用第一種指標更為常見。但是,您需要哪種指標取決于具體情況。
例如,您要sizeof *ptr
評估整個陣列的大小嗎?或者您是否希望該運算式計算為陣列單個元素的大小?
還有,你想怎么ptr
表現?你想讓指標跳轉到陣列的下一個元素嗎?或者您是否希望指標跳過整個陣列(例如,因為您正在使用陣列陣列并希望跳轉到外部陣列的下一個元素)?
如果你想sizeof *ptr
計算單個元素的大小并想ptr
跳轉到陣列的下一個元素,那么你需要第一種指標。但是,如果您想sizeof *ptr
計算整個陣列的大小并想ptr
跳過整個陣列,那么您需要第二種指標。
如果有疑問,我建議你選擇第一種指標,因為這種指標更容易處理,也更常見。
一旦你決定了你想要哪種型別的指標,你就可以創建一個這些指標的陣列。
如果您想要第一種指標的陣列,那么您可以像這樣定義該陣列:
int *ptrs[2];
ptrs[0] = n1;
ptrs[1] = n2;
如果您想要一個第二種指標的陣列,那么您可以像這樣定義該陣列:
int (*ptrs[2])[5];
ptrs[0] = &n1;
ptrs[1] = &n2;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506451.html