c++ 一维数组长度_每天一点C / 一维数组和指针
哈嘍,我是老吳,繼續(xù)記錄我的學(xué)習(xí)心得。
每天一點(diǎn)系列是我對微習(xí)慣的踐行。現(xiàn)在能做到每天一點(diǎn) C,將來就會有更多的每天一點(diǎn)系列,沒人規(guī)定嵌入式軟件工程師就只能學(xué)習(xí) C 語言和折騰 Linux,不要給自己設(shè)限。
為什么是每天一點(diǎn)?
養(yǎng)成寫作習(xí)慣的第一步:放棄追求大段的、固定的、安靜的寫作時(shí)間,培養(yǎng)隨時(shí)寫作的能力。
同樣的技巧也能應(yīng)用到技術(shù)學(xué)習(xí)上,工程師也可以放棄追求大段的、固定的、安靜的看書寫代碼的時(shí)間。遇到一個(gè)新知識,第一時(shí)間找到相關(guān)資料,找到切入點(diǎn)并將其記錄在自己的技術(shù)筆記中,并且定期復(fù)查及完善。
一、每天一點(diǎn)C / 數(shù)組和指針
正文目錄:
1.?數(shù)組名是該數(shù)組首元素的地址2.?用指針操作數(shù)組
3.?數(shù)組和指針的關(guān)系密切
4. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+數(shù)組長度
5. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+結(jié)束地址
學(xué)習(xí)環(huán)境:
- Ubuntu 16.04
- gcc version 5.4.0
1. 數(shù)組名是該數(shù)組首元素的地址
演示 demo:
#define?MONTHS?12int?main(void){
????int?days[MONTHS]?=?{31,28,31,30,31,30,31,31,30,31,30,31};
????
????if?(days?==?&days[0])
????????printf("TRUE\n");
????
????return?0;
}
運(yùn)行效果:
$?gcc?array_name.c?-o?array_name$?./array_name?
TRUE
相關(guān)要點(diǎn):
- 數(shù)組名和該數(shù)組首元素的地址都是常量,在程序的運(yùn)行過程中,不會改變。
2. 用指針操作數(shù)組
演示 demo:
#define?SIZE?4int?main(void){
????short?dates?[SIZE];
????short?*?pti;
????short?index;
????double?bills[SIZE];
????double?*?ptf;
????
????pti?=?dates;????//?assign?address?of?array?to?pointer
????ptf?=?bills;
????printf("%23s?%15s\n",?"short",?"double");
????for?(index?=?0;?index?????????printf("pointers?+?%d:?%10p?%10p\n",??index,?pti?+?index,?ptf?+?index);
????
????return?0;
}
運(yùn)行效果:
$?gcc?point_array.c?-o?point_array$?./point_array
??????????????????short??????????double
pointers?+?0:?0x7ffc890b17c0?0x7ffc890b17d0
pointers?+?1:?0x7ffc890b17c2?0x7ffc890b17d8
pointers?+?2:?0x7ffc890b17c4?0x7ffc890b17e0
pointers?+?3:?0x7ffc890b17c6?0x7ffc890b17e8
指針的值是它所指向?qū)ο蟮牡刂?#xff0c;指針前面使用 * 運(yùn)算符可以得到該指針?biāo)赶驅(qū)ο蟮闹怠?/p>
%p 會以十六進(jìn)制顯示指針的值。
必須聲明指針?biāo)赶驅(qū)ο箢愋?#xff0c;原因之一:計(jì)算機(jī)既要知道儲存對象的地址,又要知道儲存對象需要多少字節(jié)。
指針加 1 指的是增加一個(gè)數(shù)據(jù)存儲單元。對數(shù)組而言,這意味著加 1 后的地址是下一個(gè)元素的地址,而不是下一個(gè)字節(jié)的地址。
3. 數(shù)組和指針的關(guān)系密切
以下關(guān)系表明了數(shù)組和指針的關(guān)系十分密切:
days?+?2?==?&days[2]???//?TRUE,相同的地址*(days?+?2)?==?days[2]?//?TRUE,相同的值
演示 demo:
int?main(void){????int?days[MONTHS]?=?{31,28,31,30,31,30,31,31,30,31,30,31};
????int?index;
????
????for?(index?=?0;?index?????????printf("Month?%2d?has?%d?days.\n",?index?+1,?*(days?+?index));
????
????return?0;
}
運(yùn)行效果:
$?gcc?point_array2.c?-o?point_array2$?./point_array2?
Month??1?has?31?days.
Month??2?has?28?days.
...
Month?12?has?31?days.
C 語言在描述數(shù)組表示法時(shí)借助了指針:ar[n]的意思是*(ar + n)。
可在編寫程序時(shí)適時(shí)使用 數(shù)組表示法或指針表示法,這是兩種功能等效的方法。大多數(shù)情況下可以用指針表示數(shù)組,反過來,也可以用數(shù)組表示指針。
編譯器編譯這兩種寫法生成的代碼相同。
4. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+數(shù)組長度
假設(shè)要編寫一個(gè)處理數(shù)組的函數(shù),該函數(shù)返回?cái)?shù)組中所有元素之和,待處理的是名為 data 的 int 類型數(shù)組,應(yīng)該如何調(diào)用該函數(shù)?
演示 demo:
int?sum(int?ar[],?int?n);int?main(void){
????int?data[SIZE]?=?{20,10,5,39,4,16,19,26,31,20};
????long?answer;
????
????answer?=?sum(data,?SIZE);
????printf("The?total?number?of?data?is?%ld.\n",?answer);
????printf("The?size?of?data?is?%zd?bytes.\n",
???????????sizeof?data);
????
????return?0;
}
int?sum(int?ar[],?int?n){
????int?i;
????int?total?=?0;
????
????for(?i?=?0;?i?????????total?+=?ar[i];
????printf("The?size?of?ar?is?%zd?bytes.\n",?sizeof?ar);
????
????return?total;
}
運(yùn)行效果:
$?gcc?func_array.c?-o?func_arrayfunc_array.c:?In?function?‘sum’:
func_array.c:26:53:?warning:?‘sizeof’?on?array?function?parameter?‘a(chǎn)r’?will?return?size?of?‘int?*’?[-Wsizeof-array-argument]
?????printf("The?size?of?ar?is?%zd?bytes.\n",?sizeof?ar);
?????????????????????????????????????????????????????^
func_array.c:19:13:?note:?declared?hereint?sum(int?ar[],?int?n)
$?./func_array
The?size?of?ar?is?8?bytes.
The?total?number?of?data?is?190.
The?size?of?data?is?40?bytes.
數(shù)組名是該數(shù)組首元素的地址,所以實(shí)參 data 是一個(gè)儲存int 類型值的地址,那么函數(shù) sum 的形參數(shù)就應(yīng)該是一個(gè)指針。
在函數(shù)聲明或函數(shù)定義中,int ar[] 等效于 int *ar,本質(zhì)上都應(yīng)該看作是指針。
只有在函數(shù)聲明或函數(shù)定義中,才可以用int ar[]代替int *ar。
函數(shù)聲明可以省略參數(shù)名,所以下面 4 種原型都是等價(jià)的:
注意編譯器的警告信息:warning: ‘sizeof’ on array function parameter ‘a(chǎn)r’ will return size of ‘int *’,這是在提示程序員你打印的是指針的 size,而不是整個(gè)數(shù)組的 size。
int?sum(int?*,?int);
int?sum(int?ar[],?int?n);
int?sum(int?[],?int);
- 一般會把數(shù)組的參數(shù)作為其中一個(gè)參數(shù)傳遞給處理數(shù)組的函數(shù)。
5. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+結(jié)束地址
演示 demo:
int?sump(int?*?start,?int?*?end);int?main(void){
????int?data[SIZE]?=?{20,10,5,39,4,16,19,26,31,20};
????long?answer;
????
????answer?=?sump(data,?data?+?SIZE);
????printf("The?total?number?of?data?is?%ld.\n",?answer);
????
????return?0;
}
int?sump(int?*?start,?int?*?end){
????int?total?=?0;
????
????while?(start?????{
????????total?+=?*start;
????????start++;next?element
????}
????
????return?total;
}
運(yùn)行效果:
$?gcc?func_array2.c?-o?func_array2$?./func_array2
The?total?number?of?marbles?is?190.
相關(guān)要點(diǎn):
注意 answer = sump(data, data + SIZE) 和 while (start < end),這是一種推薦用法,簡潔且清晰。因?yàn)橄聵?biāo)從 0 開始,所以 data + SIZE 指向數(shù)組末尾的下一個(gè)位置。
data + SIZE 是推薦的,但是 data[SIZE] 則是錯誤的。
處理數(shù)組的函數(shù)實(shí)際上用指針作為參數(shù),但是在編寫這樣的函數(shù)時(shí),可以選擇是使用數(shù)組表示法還是指針表示法。數(shù)組表示法讓函數(shù)是處理數(shù)組的這一意圖更加明顯,而對于喜歡指針的程序員,使用指針表示法,則覺得使用指針更自然。
二、思考技術(shù),也要思考人生
我喜歡學(xué)習(xí)技術(shù),但我更愛學(xué)習(xí)如何生活。
你和我各有一個(gè)蘋果,如果我們交換蘋果的話,我們還是只有一個(gè)蘋果。但當(dāng)你和我各有一個(gè)想法,我們交換想法的話,我們就都有兩個(gè)想法了。
如果你也對 嵌入式系統(tǒng) (Linux、RTOS、OpenWrt、Android) 和 開源軟件 感興趣,并且想和更多人互相交流學(xué)習(xí)的話,請關(guān)注我的公眾號:嵌入式Hacker,一起來學(xué)習(xí)吧。
無論是關(guān)注或轉(zhuǎn)發(fā),還是打賞,都是對作者莫大的支持。對了,記得點(diǎn) 在看和點(diǎn)贊 ,如果你還想看到我的推送的話。
祝各位工作順利,家庭幸福,財(cái)源滾滾~
ps:
歡迎加入我的微信群:加我微信,我拉你進(jìn)群,暗號(加群)。
總結(jié)
以上是生活随笔為你收集整理的c++ 一维数组长度_每天一点C / 一维数组和指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓滤镜怎么调(安卓滤镜)
- 下一篇: 台山备案中心的邮箱(进台备案)