2017-06-14 78 views
1

使用指針例如,如果我有一個數組,我想提取該陣列的元件與指定的值作爲新的數組提取陣列的一部分。我做如下所示:通過用C

int a[10] = { 1, 2, 1, 3, 2, 3, 4, 1, 2, 6 }; 
int i, k; 

int count = 0; 
for (i = 0; i < 10; i++) { 
    if (a[i] == 1) { 
     count = count + 1; 
    } 
} 

int b[count]; 
k = 0; 
for (i = 0; i < 10; i++) { 
    if (a[i] == 1) { 
     b[k] = a[i]; 
     k = k + 1; 
    } 
} 

所以,對於陣列「一」我提取價值1中的所有元素,並讓他們成爲新陣列「B」。我怎樣才能通過使用指針來實現同樣的事情?它會比這種方式簡潔嗎?如果有可能,還有其他優勢嗎?

+2

沒有必要把解壓出來的具體指標,一旦你知道計數。應該只是能夠做'for(i = 0; i

+0

@EastonBornemeier哦,是的,你是對的。謝謝你的評論。 – Syoung

+0

你的問題是什麼?我不明白。 – Stargateur

回答

3

我想你已經注意到你剛剛寫1數次;但我想你想讓它適用於任意條件。

「使用指針」可以表示動態存儲器分配的,而不是一個可變長度的數組。不僅僅是因爲使用指針的緣故,然後你可以寫:

int *b = malloc(count * sizeof(int)); 
k = 0; 
for (i = 0; i < 10; i++) { 
    if (a[i] == 1) { 
     b[k] = a[i]; 
     k = k + 1; 
    } 
} 

如果只是使用指針的寫作過程中,也起見,可以按如下調整方案:

int *b = malloc(count * sizeof(int)); 
int *bPtr = b; 
for (i = 0; i < 10; i++) { 
    if (a[i] == 1) { 
     *bPtr++ = a[i]; 
    } 
} 

希望它可以幫助一點。

3

如果你不知道該陣列的部分目標值會在,在你的情況下,如果你正在尋找一個特定值,整個排序的數組,那麼就沒有優勢,使用指針,而而不是線性搜索來查找數組中的元素。

如果,但是,你正在試圖已知索引處的陣列中訪問或複製的一組連續的元素開始,則可以使用指針來簡化事情。例如,如果我在char秒的數組的最後幾個元素後是,這個工程:

#include <stdio.h> 
int main() 
{ 
    char str[100] = "I don\'t want anyone to think I hate the Calgary Flames"; 
    char *c = (str + 29); 
    printf("%s\n", c); 
    return 0; 
} 

輸出:

I hate the Calgary Flames 
2

在這種情況下,沒有,沒有任何好處。 a[i]已經基本上a + (sizeof(int) * i)。即使你使用了指針,你仍然必須做所有的計數,以確保你不會走出數組的末尾。

當其往往是方便使用指針,如串,在那裏你不知道長的空終止數組。但這不是關於性能。正如你在下面看到的,他們必須做大致相同的事情。

char string[] = "foo bar"; 

// Allocate and initialize i. 
// `string + i` twice, compare, increment. 
for(int i = 0; string[i] != '\0'; i++) { 
    printf("%c", string[i]); 
} 
puts(""); 

// Allocate and initialize s. 
// Dereference s twice, compare, increment. 
for(char *s = string; *s != '\0'; s++) { 
    printf("%c", *s); 
} 
puts(""); 

通過指針迭代很方便的地方是當你需要通過幾個步驟迭代數組。不是傳遞原始數組指針加上最後一個索引,而是更改所有函數簽名以適應,只需傳遞增加的指針並返回增加的指針即可。這允許您在字符串的中間使用標準字符串函數。

#include <stdio.h> 

char *findVal(char *string, char delim) { 
    char *val = string; 
    for(; *val != '\0' && *val != delim; val++) { 
    } 

    if(val == '\0') { 
     return NULL; 
    } 
    else { 
     // val is sitting on the ':' 
     return val+1; 
    } 
} 

int main() { 
    char string[] = "this:that"; 

    char *val = findVal(string, ':'); 
    if(val != NULL) { 
     // Just use val, not string[valIdx]. 
     printf("%s\n", val); 
    } 
} 

這也是比較安全的。有了偏移量,有兩件事必須保持同步,指針和偏移量;這會打開錯誤的偏移量與錯誤的指針一起使用的可能性。一個遞增的指針攜帶它的偏移量。


正如已指出了評論,可以收緊第二個循環,像這樣:

int b[count]; 
for (i = 0; i < count; i++) { 
    b[i] = 1; 
}