2012-12-13 37 views
0

可能重複:
pointer arithmetic in C for getting a string指針得到一個數組的元素用C

我在C新手,我想獲得一個數組中的元素與功能,我嘗試過不同的選擇,但我仍然沒有得到這些元素。 我的功能是:

void getelements(int *a, int cl) 
{ 
    int *p; 
    for (p=&a[0];p<&a[cl];p++) 
    { 
     printf("%d\n",*p); 
    } 
} 

我知道解決辦法應該像那個,但只打印第一個元素,然後存儲位置。我打電話給我的功能:

int v={10,12,20,34,45}; 
    getelements(&v,5); 

任何幫助?我需要使用指針的算術。 謝謝

+3

不應該是int'v [] = {。 ..''? – John3136

+0

您可能會注意到,'p =&a [0]'可以寫成'p = a',因爲它與'&(* p)'或'&(*(p + 0 * sizeof(int))類似)',我想。 – musicmatze

回答

0

最好傳遞數組的長度以及數組本身。

#include <stdlib.h> 
#include <stdio.h> 

void get_elements(int* values, int length) 
{ 
    int i; 
    for (i = 0; i < length; ++i) 
    { 
     printf("%d\n", values[i]); 
    } 
} 

int main(int argc, char** argv) 
{ 
    int vals[3]; 

    vals[0] = 0; 
    vals[1] = 1; 
    vals[2] = 2; 

    get_elements(vals, 3); 

    getchar(); 
    return 0; 
} 

使用類似於您原來的職位代碼(加入數組長度的方法參數)之前,你可以做如下(如果你問我這是一個有點令人費解)。

void get_elements(int* values, int length) 
{ 
    int *p; 

    for (p = &values[0]; p < &values[length]; p++) 
    { 
     printf("%d\n", *p); 
    } 
} 
0

試試這個,讓我知道這是否有效。

void getelements(int *a) 
{ 
    int *p; 
    int l=5; 
    for (p=a;p<a+l;p++) 
    { 
     printf("%d\n",*p); 
    } 
} 
0

按我的知識,看到你的code.you已經硬編碼了數組的長度爲5。我想你也可以傳遞數組長度作爲參數的功能;或者您可以使用此功能,看看它是否給出了期望的結果

void getelements(int *a) 
{ 
    int *p; 
    int i = 0; 
    int l=5; 
    p = a 
    for (i = 0;i<l;i++) 
    { 
     printf("%d\n",*(p + i)); 
    } 
} 
0

其實你逝去的陣列地址

getelements(&v,5) 

在功能

getelements() 

你像對待它陣!

void getelements(int *a, int cl) 
{ 
    int *p; 
    for (p=a;p<a+cl;p++) 
    { 
     printf("%d\n",*p); 
    } 
} 

讓我知道,如果你在概念上被清除!

1

首先,不要更新代碼來修復錯誤,而問題是打開的。它使大多數當前的答案毫無意義,不會因爲解決了您之前的代碼中的一個或多個問題的人而給予信用,並且會讓臨時讀者尋找與他們自己完全混淆的相關問題無論是問題還是其中的答案。如果你想修改一個更新,可以在增加來解決原來的問題,但是如果它是一個完全不同的問題,那麼標記爲已回答,給出它應該到的地方,並用你的新代碼和不同的問題開一個新的問題(理想情況下,無論如何)。

正如現在寫的,你的功能沒問題。但是,你真正的問題是這樣的:

// compile with -Wall -Werror and look at the warning here 
int v={10,12,20,34,45}; // <== WRONG 
getelements(&v,5);  // <== Harmless, but bad form. 

這應該是這樣的,而不是,假設你要打印陣列中的所有元素

int v[] = {10,12,20,34,45}; 
getelements(v, sizeof(v)/sizeof(v[0])); 

注意[]下你的陣列。沒有它,&v屏蔽了編譯器的一個大胖警告或錯誤,int被傳遞爲int *。此外,如果您有(-Wall -Werror海合會)視爲錯誤滿警告編譯之前的代碼,你會得到一個錯誤,如您v報關行:

main.c:116:15: Excess elements in scalar initializer 

換句話說,一切都會過去的第一要素是忽略了,因此你的指針就跑進了未定義的行爲區域。將聲明和調用更改爲我上面的內容將解決此問題,並確保您不會再犯這個錯誤,因爲sizeof(v[0])甚至不會編譯,除非v是數組或指針類型。後者在使用指針而不是陣列進行計算時仍然會引起頭痛,但這就是您必須嚴格控制自己不要在C中做的事情。

相關問題