c路歷程 品品陣列這杯茶

2021-09-05 15:36:43 字數 2842 閱讀 7505

陣列

一 關於陣列的初始化

例:int p[4]=;

1 未經初始化的陣列

auto型別的(自動儲存類)的陣列在初始化之前陣列元素是不定的,編譯器使用的在儲存單元中已有的數值。

靜態儲存式時期的陣列自動將所有元素初始化為零

2 部分初始化

int p[4]=;

則 p[0]=1,p[1]=2,p[3]=p[4]=0;

也就是說如果只初始化了陣列中的部分元素,則剩餘的元素自動初始化為0,因此如果要將乙個陣列全部初始化為零可以這樣做p[max]=

3 指定專案初始化 ( c99 )

按照傳統的方法要對陣列的最後乙個元素初始化,需要對每個元素都初始化之後才可以對最後乙個元素進行初始化。

例如: int a[5]=;

在 c99標準中可以用其新特性,指定初始化專案來簡單的完成上述工作

例如:int a[5]=;

在初始化列表中使用帶方括號的元素下標可以指定某個特定元素

例: d[8]=;

則 d[0]=1,d[1]=15,d[2]=0,d[3]=0,d[4]=9,d[5]=10,d[6]=11

注:指定專案初始化的兩個重要特性

若在乙個指定初始化專案後跟有不止乙個值,則這些值將用來對後續的陣列元素初始化。因此在d[4]=9之後,d[5].d[6]分別初始化為10,11

如果多次對乙個元素初始化,則最後一次有效.例中d[1]先被初始化為2,在[1]=15之後,d[1]又初始化為15。

指標和陣列

c語言中陣列和指標總有千絲萬縷的聯絡。表現在以下幾個方面

一 陣列名同時也是該陣列首元素的位址

對於陣列f[max]有 f==&f[0]

&運算子取得陣列元素f[0]的記憶體位址,因此f和&f[0]都是常量且相等

二 可以使用指標處理陣列

若p[max]是乙個陣列,其首位址為0x00000000那麼p+1的值是0x00000001嗎?

回答是不一定。因為對乙個指標加上1結果是對該指標增加乙個儲存單元。對於陣列位址會增加到下乙個元素的首位址,而不一定是乙個位元組。那麼p和p+1之間到底相差多少呢?這要有p所指物件的型別來決定。如果陣列的型別是type那麼p與p+1相差 sizeof(type)個位元組。

總結: 1 指標的數值就是它所指向的物件的位址,位址的內部表示由硬體決定。

2 對指標加1等價於對指標的值加上它指向物件的位元組大小。

c 語言標準描述陣列時,借助了指標的概念,例如a[n]的意思是*(a+n),即先定址到記憶體中的a,然後移動n個單位,再取出該記憶體處的值。

因此 p+2==&p[2], *(p+2)==p[2]

在這裡要區分 *(p+2)和*p+2的不同。由於*運算子的優先順序比+要高, *(p+2)得到的是陣列p中第三個元素的值。 *p+2得到的是陣列p中第乙個元素的值與2相加後的結果。

三 指標陣列和指向陣列的指標

int *p[3]和 int (*p)[3]有什麼區別呢?

1 的優先順序高於* 因此int *p[3]等價於int *(p[3])括號內顯然是乙個陣列,括號外的部分表明了陣列p的型別,因此p是乙個含有3個元素的陣列,陣列的每乙個元素是乙個指標,而且是指向int型變數的指標。

2 int (*p)[3]使得指標p指向了乙個包含有3個元素的陣列,該陣列中元素型別為int。 可以用下面的方法記憶

int *p ;

int a;

p= &a;

*p=a;

因此(*p)用a代替,從字面上看int(*p)[3]替換為int a[3] ,故可以理解p指向了a[3]。

四 指標和多維陣列

int  zippo[4][2];   /*整數陣列的陣列*/

陣列名 zippo是陣列首元素的位址 zippo的首元素本身又是包含兩個int型變數的陣列。

zippo得值和&zippo[0]相同,而 zippo[0]的值同其首元素的位址&zippo[0][0]

相同。zippo[0]是乙個整數大小的位址,而zippo是兩個整數大小物件的位址。

對乙個指標加1,會對原來的數值加上乙個對應型別大小的數值。在這方面zippo和zippo[0]是不一樣的。zippo所指的物件是兩個int,而zippo[0]所指的物件是乙個int

對乙個指標取值得到的是該指標所指物件的數值

*(zippo[0]) 代表儲存在zippo[0][0]中的數值,即乙個int值

*zippo 代表其首元素zippo[0]的值,但zippo[0]本身就是乙個int數的位址即 &zippo[0][0],所以 *zippo 就是 &zippo[0][0], **zippo <=> *&zippo[0][0] <=> zippo[0][0]

變長陣列

一 宣告變長陣列

c99標準引入變成陣列,它允許使用變數定義陣列維數

變長陣列有一些限制,變長陣列必須是自動儲存類的,這意味著他們必須在函式內部或作為函式宣告且宣告時不可以進行初始化。

示例:  int m=2,n=3;

int a[m][n];

這裡a是乙個二維陣列。

「變長」的意思是指在程式執行時動態的建立不同維數的陣列,而每一次建立以後該陣列就是固定大小的,知道其生存期結束。

二 變長陣列作為函式引數

由於變長陣列維數在執行時確定,故將其作為函式引數可以提高程式的靈活性和適應性。

宣告乙個帶變長陣列引數的函式

int sum (int rows, int cols, int ar[rows][cols]);

注: ar的宣告中使用了rows和cols,所以在引數列表中對rows和cols的宣告要早於ar。

c99標準規定可以省略函式原型中的名稱,但如果省略名稱,則需要用星號代替省略的維數。 例如 int sum (int rows, int cols, int ar[*][*]);

你品,你細品!

致橡樹 我如果愛你 絕不像攀援的凌霄花,借你的高枝炫耀自己 我如果愛你 絕不學痴情的鳥兒,為綠蔭重複單調的歌曲 也不止像泉源,常年送來清涼的慰藉 也不止像險峰,增加你的高度,襯托你的威儀。甚至日光,甚至春雨。不,這些都還不夠!我必須是你近旁的一株木棉,作為樹的形象和你站在一起。根,緊握在地下 葉,相...

合併菜品變成菜品組

這道題是我朋友問的,而我只是自己寫的案例,所以格式什麼的都是自己定義的。問題 現在前端詢問,給了個時間段,比如2019 01 01至2019 08 01,你查詢出來了這段時間使用到的菜品,放置到了乙個list中,使用node物件表示,start代表菜品開始時間,end代表菜品結束時間,name代表菜...

全是泊來品

解說愛情 什麼叫浪漫?明知那個女孩兒不愛他,還送給她999朵玫瑰 什麼叫浪費?明知那個女孩兒愛他,還送給她999朵玫瑰。某青年作家定義浪漫與浪費 每個女人都有兩個版本 精裝本和平裝本。精裝本是給別人看的,平裝本是給家人和丈夫看的。婚姻中的丈夫只看到妻子的平裝本和別的女人的精裝本 這就是婚外戀的動機。...