2014-07-11 238 views
0

快速提問如何爲變量賦值數組元素的值。試圖確保我的代碼使用最小的內存。C變量賦值給數組元素

如果我有一個預定義的結構體數組,並且想要創建對數組中一個元素的引用,那麼如何創建該變量以便通過引用傳遞而不是值?我搜索了這個,但也許我的搜索字符串不是它需要的。

例如

#myfile.h 
typedef struct { 
    uint8_t abba; 
    uint8_t zabba; 
} mystruct; 

extern mystruct mystructs[2]; 

#myfile.c 
mystruct mystructs[2] = { 
    {.abba=0,.zabba=1}, 
    {.abba=2,.zabba=3} 
}; 

void myfunc1() { 
    mystruct ms1 = mystructs[1]; 
    printf("%d", ms1.abba); 
    ms1.zabba = 5; 
} 

void myfunc2() { 
    printf("%d", mystructs[1].abba); 
    mystructs[1].zabba = 5; 
} 

所以我的問題如下: 當我創建myfunc1 MS1,它只是給mystructs一個參考文獻[1]?或者它將元素複製到ms1中?

myfunc1和myfunc2會在內存使用情況下產生相同的結果嗎?

將ms1.zabba = 5實際更新mystructs [1] .zabba?

+0

如果我能接受Peter Schneider和Quentin的答案。 Peter詳細介紹了它的工作原理,Quentin給出了創建ms1作爲指針的例子。 – user3817250

回答

2

當我創建myfunc1 MS1,它只是給mystructs一個參考文獻[1]?

不,這是一個副本。

還是把它複製到ms1中?

是。

myfunc1和myfunc2會在內存使用情況下產生相同的結果嗎? (更詳細地說:myfunc1創建一個mystruct類型的本地對象(「在堆棧上」);在離開函數之後,所有東西都恢復到原來的樣子,所以沒有造成任何危害。結構並不大,所以沒問題,在個人電腦上你可能會遇到大的問題(MBs)或昂貴的問題(例如套接字連接))。

不,因爲ms1是副本。

您可能想使用指針或引用。

2

這是一個副本。你需要使用一個指針來實際修改遠程結構:

void myfunc1() { 
    mystruct *ms1 = &mystructs[1]; 
    printf("%d", ms1->abba); 
    ms1->zabba = 5; 
} 
+0

我最初在我的代碼中試過這個,但我得到了警告。 「#145-D」const mystruct *「類型的值不能用於初始化一個」mystruct *「類型的實體,所以我假定我做了錯誤的事情。代碼編譯並且似乎按照預期的那樣運行。 – user3817250

+0

警告不要掉以輕心,但在你的問題中沒有提到'mystructs'是'const' ... – Quentin

+0

Quentin說的是真實的;不應該發生警告如果你嘗試組裝一個小的工作示例需要編譯器消息的main()!)我們可以看到它來自哪裏,可能會很明顯 –