日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ 一维数组长度_每天一点C / 一维数组和指针

發(fā)布時間:2023/12/2 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 一维数组长度_每天一点C / 一维数组和指针 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

哈嘍,我是老吳,繼續(xù)記錄我的學(xué)習(xí)心得。

每天一點系列是我對微習(xí)慣的踐行。現(xiàn)在能做到每天一點 C,將來就會有更多的每天一點系列,沒人規(guī)定嵌入式軟件工程師就只能學(xué)習(xí) C 語言和折騰 Linux,不要給自己設(shè)限。

為什么是每天一點?
養(yǎng)成寫作習(xí)慣的第一步:放棄追求大段的、固定的、安靜的寫作時間,培養(yǎng)隨時寫作的能力。

同樣的技巧也能應(yīng)用到技術(shù)學(xué)習(xí)上,工程師也可以放棄追求大段的、固定的、安靜的看書寫代碼的時間。遇到一個新知識,第一時間找到相關(guān)資料,找到切入點并將其記錄在自己的技術(shù)筆記中,并且定期復(fù)查及完善。


一、每天一點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?12
int?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;
}

運行效果:

$?gcc?array_name.c?-o?array_name

$?./array_name?
TRUE

相關(guān)要點:

  • 數(shù)組名和該數(shù)組首元素的地址都是常量,在程序的運行過程中,不會改變。

2. 用指針操作數(shù)組

演示 demo:

#define?SIZE?4
int?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;
}

運行效果:

$?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;指針前面使用 * 運算符可以得到該指針?biāo)赶驅(qū)ο蟮闹怠?/p>

  • %p 會以十六進(jìn)制顯示指針的值

  • 必須聲明指針?biāo)赶驅(qū)ο箢愋?#xff0c;原因之一:計算機(jī)既要知道儲存對象的地址,又要知道儲存對象需要多少字節(jié)。

  • 指針加 1 指的是增加一個數(shù)據(jù)存儲單元。對數(shù)組而言,這意味著加 1 后的地址是下一個元素的地址,而不是下一個字節(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;
}

運行效果:

$?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ù)組表示法時借助了指針:ar[n]的意思是*(ar + n)。

  • 可在編寫程序時適時使用 數(shù)組表示法或指針表示法,這是兩種功能等效的方法。大多數(shù)情況下可以用指針表示數(shù)組,反過來,也可以用數(shù)組表示指針。

  • 編譯器編譯這兩種寫法生成的代碼相同。


4. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+數(shù)組長度

假設(shè)要編寫一個處理數(shù)組的函數(shù),該函數(shù)返回數(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;
}

運行效果:

$?gcc?func_array.c?-o?func_array
func_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ù)組首元素的地址,所以實參 data 是一個儲存int 類型值的地址,那么函數(shù) sum 的形參數(shù)就應(yīng)該是一個指針。

  • 在函數(shù)聲明或函數(shù)定義中,int ar[] 等效于 int *ar,本質(zhì)上都應(yīng)該看作是指針。

  • 只有在函數(shù)聲明或函數(shù)定義中,才可以用int ar[]代替int *ar

  • 函數(shù)聲明可以省略參數(shù)名,所以下面 4 種原型都是等價的:

  • 注意編譯器的警告信息:warning: ‘sizeof’ on array function parameter ‘a(chǎn)r’ will return size of ‘int *’,這是在提示程序員你打印的是指針的 size,而不是整個數(shù)組的 size。

int?sum(int?*ar,?int?n);
int?sum(int?*,?int);
int?sum(int?ar[],?int?n);
int?sum(int?[],?int);
  • 一般會把數(shù)組的參數(shù)作為其中一個參數(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;
}

運行效果:

$?gcc?func_array2.c?-o?func_array2

$?./func_array2
The?total?number?of?marbles?is?190.

相關(guān)要點:

  • 注意 answer = sump(data, data + SIZE) 和 while (start < end),這是一種推薦用法,簡潔且清晰。因為下標(biāo)從 0 開始,所以 data + SIZE 指向數(shù)組末尾的下一個位置。

  • data + SIZE 是推薦的,但是 data[SIZE] 則是錯誤的。

  • 處理數(shù)組的函數(shù)實際上用指針作為參數(shù),但是在編寫這樣的函數(shù)時,可以選擇是使用數(shù)組表示法還是指針表示法。數(shù)組表示法讓函數(shù)是處理數(shù)組的這一意圖更加明顯,而對于喜歡指針的程序員,使用指針表示法,則覺得使用指針更自然。

二、思考技術(shù),也要思考人生

我喜歡學(xué)習(xí)技術(shù),但我更愛學(xué)習(xí)如何生活

你和我各有一個蘋果,如果我們交換蘋果的話,我們還是只有一個蘋果。但當(dāng)你和我各有一個想法,我們交換想法的話,我們就都有兩個想法了。

如果你也對 嵌入式系統(tǒng) (Linux、RTOS、OpenWrt、Android) 和 開源軟件 感興趣,并且想和更多人互相交流學(xué)習(xí)的話,請關(guān)注我的公眾號:嵌入式Hacker,一起來學(xué)習(xí)吧。

無論是關(guān)注或轉(zhuǎn)發(fā),還是打賞,都是對作者莫大的支持。對了,記得點 在看和點贊 ,如果你還想看到我的推送的話。

祝各位工作順利,家庭幸福,財源滾滾~

ps:
歡迎加入我的微信群:加我微信,我拉你進(jìn)群,暗號(加群)。

總結(jié)

以上是生活随笔為你收集整理的c++ 一维数组长度_每天一点C / 一维数组和指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。