2013-01-10 84 views
0

我有一些繼承的代碼和一個函數,它將字符數組作爲參數。數組訪問,指針混淆

typedef char myString[256]; 

void MyFunc(myString param) 
{ 
    int i; 

    for (i = 0; i < 256; i++) 
    { 
    if (param[i] .... 

我想使這更有效和指針傳遞到字符數組:

void MyFunc(myString *param) 
{ 
    int i; 

    for (i = 0; i < 256; i++) 
    { 
    if (*param[i] <========= Thsi is wrong 

當我嘗試引用數組的元素,我得到了錯誤的值,所以很明顯的東西是我的指針取消引用錯誤。我用C編碼已經有一段時間了,所以我看不到明顯的錯誤。

有人可以指出嗎?

+5

當傳遞給一個函數,數組 「衰變」 的指針反正。玩這種遊戲不會使它更有效率。 – dmckee

+2

研究數組語義的時間 –

+0

這可能是有用的材料BTW:[C書 - 數組,運算符和函數](http://publications.gbdirect.co.uk/c_book/chapter5/arrays_and_address_of.html)。我最喜歡的C參考資料之一。 – detly

回答

6

你可能不想通過指針傳遞它;當你在參數中使用這個類型時,它總是變成一個指針,而第二級間接尋址效率較低。

如果使用「指向數組的指針」符號,那麼你需要括號得到正確的優先級:

if ((*param)[i] ...) 
    ... 
+0

+1和答案,謝謝。告訴你我的C是生鏽的;-) – Mawg

1

//這是可行的:一個數組可以作爲「的char *」來處理,反之亦然 char myString [256];

void MyFunc(char * param) 
{ 
    int i; 

    for (i = 0; i < 256; i++) 
    { 
    if (param[i] ... 

問:我想使這更有效和指針傳遞到 字符數組

答:有絕對沒有區別效率是否傳遞「參數[ ]「或」* param「

for (i = 0; i < 256; i++) 
    { 
    if (*param[i] <==== <========= Thsi is wrong 

是的 - 這是錯誤的。再次,「param[]」和「*param」應該以同樣的方式處理。

同樣的,或沒有「的typedef」,太:)

最後,這是同樣的程序與類型定義:

typedef char myString[256]; 

void MyFunc(myString param) 
// This is treated as "MyFunc(char param[256])" 
// It is *identical* to "MyFunc(char * param)" 
{ 
    int i; 

    for (i = 0; i < 256; i++) 
    { 
    if (param[i] .... 
+1

當函數的參數是'MyFunc(myString * param)'而不是'MyFunc(myString param)'時,在符號和效率上都有差別。 –

2

myString *是指向一個字符數組256元,也就是,param具有類型

char (*)[256] 

所以你必須取消引用param第一,然後訪問它的元素。

  1. 通過取消引用param,你得到了數組param指向的第一個元素的地址。
  2. (*param)[i]然後是有問題的數組的第i個元素。