c primer plus第10章總結 陣列和指標

2021-07-13 21:35:34 字數 3725 閱讀 7687

1、陣列初始化 :

陣列:元素數目+元素型別;

int powers[4] = ;     // 花括號,逗號隔開;未經初始化的陣列,編譯器會使用儲存單元中的已有的數值給它賦值;

days = ; // 允許,編譯器會根據列表中數值數目來確定陣列大小;

指定初始化專案: int arr[6] = ;// 其他未初始化的元素都被設定為0;多次對同一元素賦值,最後一次有效;

指標初始化 :

int* p = null;

int* p = new int[10];   // 注意

delete

p(陣列) 或者delete p(非陣列)

;

指標和陣列粘合:

// 一維陣列

char str[10] = ;

char* p = str;

// 一維陣列

char str[10] = ;

char* p = str;

// 普通變數

int a = 1;

int* pa = &a;

若函式引數為指標,且指向二維陣列,呼叫該函式時,需要帶[0];例:

rain_ptr

( rain

[0]);

2、const 宣告陣列:

使用const 使陣列唯讀,程式可以從陣列中讀取數值,但是不能像陣列中寫資料;

const int days[12] = ;     //  宣告之後不能再對它賦值;

形參使用const:

int sum(const int ar, int n);// 定義ar所指向的陣列值為常量,不允許修改;

指向常量的指標不能修改數值,將常量或非常量資料的位址賦值給指向常量的指標時合法的;但只有非常量的資料位址才可以賦值給普通指標;

const double* p = days ; 指標指向的值不能被改變,但可以改變位址來改變指向的陣列值;

double* const p = days ; 指標位址不能變; 

守則:在能加const的地方都加上

3、遍歷index,列印陣列中各個元素:

int days[12] = ;

for (int index = 0;  index < 12;  index++)

printf("month %d has %2d days.\n", index +1,   days[index]);

僅字元陣列可以直接整體列印,但字元陣列

必須有 0 結尾;識別符號用 %s;

char 

ar = ;

printf(

"%s\n"

,ar);

4、為陣列賦值:

c語言不支援把陣列作為乙個整體賦值,也不支援花括號括起來的列表形式賦值(初始化的時候除外);

通過迴圈陣列索引對數組成員賦值:

int counter, evens[12];

for (counter = 0; counter < 12; counter++)

evens[counter] =  2 * counter;

5、多維陣列:

float rain[5][12]; // 5個由12個浮點數組成的陣列的陣列;

初始化二維陣列:

const float rain[years][months] =

,     // 逗號分離隔的5個數值列表;

,     // 某一行賦值錯誤,不會影響下一行;,,

};6、指標和陣列:

陣列名也是該陣列首元素的位址,指標說明符%p,通常以十六進製制顯示值;系統按位元組編址,對指標+1 ,是對該指標增加乙個

dates +2 ==  &dates[2];// 位址相同

*(dates + 2) == dates[2];// 相同的值    // 間接運算子* 的優先順序高於+;

ar為指標或陣列,均有 ar[i] 和 *(ar+i) 等價;

ar為指標時,才能使用 ar++;

計算陣列長度:

int ar = ;

int n = sizeof ar / sizeof (int );

指標指向的陣列長度怎麼計算??無法計算。

7、函式、陣列、指標:

僅 在函式原型或函式定義頭時,可以用 int *ar 代替 int ar;   此時指標與陣列等效;

宣告陣列參量:

如果實際引數是乙個陣列名,形式參量必須是與之匹配的指標;

函式原型中,以下4種可相互等效:

int sum (int *char, int n)

int sum (int *, int )

int sum (int ar, int n)

int sum (int , int )

函式定義時,名稱不能省略,以下2種可相互等效 :

int sum (int *char, int n)

int sum (int ar, int n)

說明符列印sizeof()的返回值,用%zd;

8、使用指標引數:

// 用index遍歷元素,求陣列元素和;

int main(void)

; long answer;

answer = sum(marbles, size);

return 0;

}int sum(int ar, int n)

// 定義兩個指標,start 和 end 指明指標起始和結束位址;    

int main(void)

; long answer;

answer = sump(marbles, marbles + size);

return 0;

}int sump(int * start, int * end)

return total;

}

課後習題

第一題:二維陣列轉化為一維陣列:

for(year

= 0,

total

= 0;

year

<

years

;year

++)

第二題:用陣列和指標複製乙個陣列;

// 用陣列符號進行拷貝

voidcopy_arr(doublesource,doubletarget1,intn)

printf("\n");

}

// 用指標進行拷貝

void copy_ptr (double* source , double *target2 , int n )

printf("\n");

}

第十題:初始化陣列、翻倍陣列中各元素;

double*ar

=get_double(n

,m);

double

*init_ar

(intn,

intm)

printf(

"\n");

} printf

("\n");

return

ar;

}

C Primer Plus 第11章 筆記

1 如果字串字面量之間沒有間隔,或者用空白字元分隔,c會將其視為串聯起來的字串字面量。2 用標準的陣列初始化模式給字串初始化時,末尾一定要加上 0 不然就不是乙個字串,而是乙個字元陣列。讓編譯器計算陣列的大小只能用在初始化時。4 const char ar1 something is pointin...

C primer plus 第4章 復合型別

1.陣列初始化 2.字串 兩種方式 c 風格字串 以 0結尾 string類庫 單引號表示字元常量 a 是字串編碼的簡寫,char a a 是正確的。但是 a 表示的是兩個字元a和 0組成的字串,實際上 a 表示的是字串所在的記憶體位址,因此char a a 是非法的 1 cin.getline a...

c primer plus 第8章 函式探幽

c 擴 展 了 c 語 言 的 函 數 功 能 通 過 將 inline 關鍵 字 用 於 函 數 定 義 並 在 首 次 調 用 該 函 數 前 提 供 其 函 數 定 義 可 以 使 得c 艹 編 譯 器 將 該 函 數 視 為 內 聯 函 數 也 就 是 說 編 譯 器 不 是 讓 程 序 跳...