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;
若函式引數為指標,且指向二維陣列,呼叫該函式時,需要帶[0];例:// 普通變數
int a = 1;
int* pa = &a;
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 艹 編 譯 器 將 該 函 數 視 為 內 聯 函 數 也 就 是 說 編 譯 器 不 是 讓 程 序 跳...