簡體   English   中英

指向數組的重點是什么?

[英]What is the point of pointers to arrays?

所以,我正在閱讀有關指針的內容,並且遇到了指向數組的指針。 問題是指向數組的指針根本不是真的有用,因為我可以直接獲取元素,而不是使用指針來獲取數組元素的偏移量。 但是我覺得好像我錯過了這些可能有用的原因。

所以,簡而言之,指向數組的重點是什么; 如何以及為什么要使用它們,它們是否有任何實際應用?

編輯:我的意思是在普通/簡單數組的上下文中,例如:

int array[5];

編輯:正如Keith指出的那樣,我特別詢問指向數組的指針,例如char (*ptr)[42] ,它是指向42個元素char數組的指針。

不幸的是,你收到的一些答案顯示了對C中指針和數組的誤解,簡而言之:

1)指向數組的指針與指向第一個元素的指針不同。

2)聲明數組類型與聲明指針不同。

您可以在C faq部分找到與指針和數組之間常見混淆相關的完整描述: http//c-faq.com/aryptr/index.html

解決您的問題 - 指向數組的指針有助於傳遞整個編譯時已知大小的數組,並在參數傳遞期間保留有關其大小的信息。 當你在某些數組的子數組上操作什么時處理多維數組時,它也很有用。

在大多數表達式中,類型為“T of array”的對象將降級為第一個數組元素的地址,該數組元素的類型為“指向T的指針”。 從這個意義上講,指針類型可用於表示項目數組,並在需要動態分配數組時用於執行此操作。

// ptr used to dynamically allocate array [n] of T
T *ptr = malloc(n * sizeof(*ptr));

在指向數組的指針的情況下,它可以用於表示數組的數組,和/或動態地分配數組的數組。 因此,指向數組的指針可用於表示二維數組。

// ptr used to dynamically allocate 2 dimensional array [n][10] of T
T (*ptr)[10] = malloc(n * sizeof(*ptr));

到目前為止尚未真正解決的數組的真指針並不常見,因為數組在大多數上下文中衰減為指向其第一個元素的指針,並且因為數組在內存中是按照定義連續的,通常只需要它。 與其他指針類型相比,它們也有些不切實際,因為無法分配數組類型。 在這方面,它們類似於函數指針。

最大的實際差異來自於它們在指針衰減(例如函數調用和返回)丟失的情況下保留數組的大小。 以下面的代碼為例

void function(char (*array)[10]) {
    for(size_t i = 0; i < sizeof(*a); i++);
        (*a)[i] = i;
}
...
char a[10];
function(&a);

除了允許sizeof的這個應用程序(由於大小被稱為參數的一部分,這不是非常有用),這將強制傳遞參數的確切大小作為類型的一部分,哪個function(char array[10])即使用[static 10]也不會這樣做。 返回有一個不尋常的語法:

char (*function(void))[10] {
    static char array[10];
    // do something with our static array
    return &array;
}
char (*a)[10] = function();
// or even
char (*b)[sizeof(*function())] = function();

我不認為我曾經在野外遇到過這種應用,但它至少是可能的(合法的)。

如果您有一個數組數組,則指向數組的指針變得有用,如下所示:

typedef float Point[3];
Point points[10];

Point *p;
for (p=points;p<points+10;++p) {
   ...
}

這是使用指向數組的指針的真實示例:

typedef double t_matrix33[3][3];

// Result = AB
//                  const double (* M1)[3], const double (* M2)[3], double (* Result)[3] 
void Matrix33xMatrix33( const t_matrix33 M1, const t_matrix33 M2, t_matrix33 Result ) {

    t_matrix33 copy;
    const t_matrix33 * A = ( const t_matrix33 * )M1;  // const double (* A)[3][3] = const double (* M1)[3]
    const t_matrix33 * B = ( const t_matrix33 * )M2;  // const double (* B)[3][3] = const double (* M2)[3]
    int Raw;
    int Col;
    int i;

    // !!! Make copies if Result is the same as M1 and/or M2!

    //const double (* A)[3][3] == double (* Result)[3]
    if( A == ( const t_matrix33 * )Result ) {  // cast is must -- to get rid of gcc warnings

        memcpy( copy, A, sizeof( t_matrix33 ) ); 
        A = ( const t_matrix33 * )copy;

        if( B == ( const t_matrix33 * )Result ) {
            B = ( const t_matrix33 * )copy;
        }
    }

    else if( B == ( const t_matrix33 * )Result ) {
        memcpy( copy, B, sizeof( t_matrix33 ) ); 
        B = ( const t_matrix33 * )copy;
    }

    for( Raw = 0; Raw < 3; ++Raw ) {
        for( Col = 0; Col < 3; ++Col ) {
            Result[ Raw ][ Col ] = 0;
            for( i = 0; i < 3; ++i ) {
                Result[ Raw ][ Col ] += (*A)[ Raw ][ i ] * (*B)[ i ][ Col ];
            }
        }
    }
};

感謝AB指針,我們可以避免在M1和/或M2的情況下多余的memcopies與Result

我現在能想到的是(我相信還有其他的), you want to make multidimensional array但是你現在沒有任何數據可以保存在數組的第二維或第三維中。 您不希望通過為數組的第二維和第三維保留空間來浪費內存,但是當您有數據要存儲時,您計划稍后分配內存,這就是指向數組的指針。

例如。

for (int i=0; i<10; i++)
   (*x)[i] = malloc(N * sizeof(*x));


   // take input or put data in the array

C中2d數組的表示:

這個網站解釋得很好。 這應該可以幫助您消除任何混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM