簡體   English   中英

C:使用指針反向數組?

[英]C : reverse array using pointers?

我沒有看到我在這段代碼中哪里出錯了:

void swap(int* a, int* b)
{
int temp = *a;

*a = *b;
*b = temp;
}

void array_reverse(int *begin, int *end)
{
    int *end2 = end;
    int *q = 0;
    for (q = begin; q < end; q += 1)
    { 
        swap(q, end2); 
        end2 -= 1;
    }
}

它應該反轉數組:

arr{ 1, 2, 3}

變成:

arr{ 3, 2, 1}

我的輸出:

[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10] 

變成:

[111009824,  2,  3,  4,  5,  6,  7,  8,  9, 10]

(實際上,每次編譯和測試我的函數時,第一個元素總是會發生變化,並給我隨機值,我猜)

問題在於 for 循環

void array_reverse(int *begin, int *end)
{
    int *end2 = end;
    int *q = 0;
    for (q = begin; q < end; q += 1)
    { 
        swap(q, end2); 
        end2 -= 1;
    }
}

您必須將end更改為end2以便在到達中間時停止您還必須在調用 swap 之前減少 end2,以便您指向正確的值

void array_reverse(int *begin, int *end)
{
    int *end2 = end;
    int *q = 0;
    for (q = begin; q < end2; q += 1)
    { 
        end2 -= 1;
        swap(q, end2); 

    }
}

函數調用看起來像這樣

int test[10] = {1,2,3,4,5,6,7,8,9,10};
array_reverse(test, test + 10);

有兩個問題。 for循環中, end應該是end2

for (q = begin; q < end2; q += 1) {
    swap(q, end2); 
    end2 -= 1; }

另一個問題是通話。 它應該是array_reverse (a, a+9); 因為array索引從0開始。 為具有長度為 10 的array的第二個參數提供a+10會傳遞一個指向數組邊界之外的無意義的指針。

我必須對這個問題表示贊賞,它讓我研究了“交換指針地址”和交換“指針指向的數據”之間的根本區別。

還有一點值得注意的是,在 C 中, 函數參數是按值復制的 我們可以像這樣重寫array_reverse而不會產生不利后果。 為什么這樣做?

void array_reverse(int *begin, int *end)
    for ( ;begin < end; ) swap(begin++, end--)

函數體接收要處理的參數的本地副本 因此,修改它們的值並沒有錯。 保證函數不能在函數外部修改其參數的初始值,而不模擬通過某種形式的間接引用傳遞。 掌握這個概念非常簡單。

這是使用while編寫循環的另一種方法。

void array_reverse(int *first, int *last)
{
    int *f = first;
    int *l = last;
    while (f < l)
    { 
        swap(f, l);
        f++, l--;
    }
}

暫無
暫無

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

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