c中陣列詳解
從函式返回陣列
小結c指向陣列的指標
節點陣列的初始化
指標與陣列名的區別
c enum(列舉)
c語言支援陣列資料結構,它可以儲存乙個固定大小的相同型別元素的順序集合。陣列是用來儲存一系列資料,但它往往被認為是一系列相同型別的變數。
陣列的宣告並不是宣告乙個個單獨的變數,比如num0、num1、…num99,而是宣告乙個陣列變數,比如nums,然後使用nums[0]、nums[1]、…nums[99]來帶代表乙個個單獨的變數。陣列中的特定元素可以通過索引訪問。
所有的陣列都是由連續的記憶體位置組成。最低的位址對應第乙個元素,最高的位址對應最後乙個元素。
宣告陣列
在c中要宣告乙個陣列,需要制定元素的型別和元素的數量,如圖:
型別 陣列名字[陣列尺寸];
這叫一維陣列。陣列的尺寸必須是乙個大於零的整數常量,型別可以使是任意有效的c資料型別。
初始化陣列
在c中,可以逐個初始化陣列,也可以使用乙個初始化語句。
大括號{}之間的值的數目不能大於在陣列宣告時在方括號中指定的元素數目。
如果省略了陣列的大小,陣列的大小則為初始化時元素的個數。
所有的陣列都是以0作為它們第乙個元素的索引,也被稱為基索引,陣列的最後乙個索引是陣列的總大小減去1。
訪問陣列元素
陣列元素可以通過陣列名稱加索引進行訪問。元素的索引是放在方括號內,跟在陣列名稱的後邊。
多維陣列
c支援多維陣列。多維陣列最簡答的形式是二維陣列。多維陣列宣告的一般形式:
型別 名字[行數][列數]…[sizen]
二維陣列
多維陣列最簡單的形式是二維陣列。乙個二維陣列,在本質上,是乙個一維陣列的列表。type可以是任意有效的c資料型別,陣列名是乙個有效的c識別符號。
陣列中的每個元素是使用形式a[i,j]的元素名稱來標識的,其中a是陣列名稱,i和j是唯一標識a中每個元素的下標。
初始化二維陣列
多維陣列可以通過在括號內為每行指定值來進行初始化。內部巢狀的括號時可選的。二維陣列中的元素是通過使用下標(即陣列的行索引和列索引)來訪問。
二維陣列在邏輯上是方陣,由行和列組成。
但是二維陣列在物理上是線性的,按行來依次進行存放,記憶體是連續的。
二維陣列名的步長是一行的長度。具體到每乙個元素加1的時,位址增加的是乙個元素所佔位元組的大小,因此元素的步長即為元素本身的大小。
將二維陣列當做引數時,必須指明所有維數大小或者第一維的,但是不能省略第二維或者更高維的大小,這是由編譯器原理限制的。
在定義二維陣列時對其進行初始化,也可以省略第一維,編譯器會根據設立的初始化語句自動決定第一維度。
c傳遞陣列給函式
可以通過制定不帶索引的陣列名稱來給函式傳遞乙個指向陣列的指標。
如果想要在函式中傳遞乙個一維陣列作為引數,必須以下面三種方式來宣告函式形式引數,這三種宣告方式的結果是一樣的,因為每種方式都會告訴編譯器將要接收乙個整型指標。同樣地,可以傳遞乙個多維陣列作為形式引數。
方式1void a(int *b){}
形式引數是乙個指標
方式2形式引數是乙個已定義大小的陣列:
void a(int b[100]){}
方式3形式引數是乙個未定義大小的陣列
void a(int b){}
demo:
#include
//第一維的長度可以不指定,但必須制定第二位的長度
void
print_a
(int a[
5],int n,int m)
}void
print_b
(int
(*a)[5
],int n,int m)
}//利用陣列是順序儲存的特性,通過降維來訪問原陣列!
void
print_c
(int *a, int n, int m)
}void
main()
,,,,
};printf
("\n方法1:\n");
print_a
(a,5,5
);printf
("\n方法2:\n");
print_b
(a,5,5
);printf
("\n方法3:\n");
print_c
(&a[0]
[0],
5,5)
;}
從函式返回陣列
c允許從函式返回陣列。
c語言不允許返回乙個完整的陣列作為函式的引數。可以通過指定不帶索引的陣列名來返回乙個指向陣列的指標。
如果想要從函式返回乙個一維陣列,必須宣告乙個返回指標的函式,如:
int *fun(){}
c不支援在函式外返回區域性變數的位址,除非定義區域性變數為static變數。
小結srand((unsigned)time(null))是初始化隨機函式種子:
1.是拿當前系統時間作為種子,由於時間是變化,種子變化,可以產生不相同的隨機數。計算機中的隨機數實際上都不是真正的隨機數,如果兩次給的種子一樣,是會生成同樣的隨機序列。所以,一般都會議以前的時間作為種子來生成隨機數,這樣更加的隨機。
2.使用時,引數可以是unsigned型的任意資料,比如srand(10);
3.如果不使用srand,用rand()產生的隨機數,在多次執行,結果是一樣。
c指向陣列的指標
陣列名是乙個指向陣列中第乙個元素的常量指標。
指標與陣列的區別
char *str=「hello」;
char arrgs=「hello」;
字元陣列:
char p=(char)&arrgs== char *p=arrgs;
cahr p=(char)(&(arrgs[0]))== &arrgs==arrgs;
字串指標:
char p=(char)&str!=str;str == str[0] ==『h』
得出結論字元陣列的首位址可以用arrgs,&arrgs,來表示並且它們相等,
但是指標&str和str是不同的,當遇到字串指標時要注意處理方式。
節點陣列是一種一次申請多個變數的方法,陣列的使用可以在程式中保留多個變數的值,進行處理。
在沒有明確陣列的元素個數時,在程式中想知道資料單元個數可以使用sizeof(a)/szieof(a[0])。其中sizeof(a)是得到陣列a的大小,sizeof(a[0])是得到陣列a中單個元素的大小(因此可以不必要是a[0],a[i]都行)。
demo
#include
void
main()
; int b;
b=sizeof
(a)/
sizeof
(a[0])
;printf
("陣列元素個數:%d"
,b);
}
陣列的初始化
對於陣列的初始化需要注意以下幾點:
(1)可以只給部分元素賦值,當{}中值的個數少於元素個數時,只給前面部分元素賦值。
當賦值的元素少於陣列總體元素時,不同型別剩餘的元素自動初始化值:
對於short、int、long,就是整數0;
對於char,就是字元』\0』;
對於float、double,就是小數0.0。
對於陣列初始化,根據剩餘的元素會自動初始化為0,只需給第0個元素賦值為0即可。
(2)只能給元素逐個賦值,不能給陣列整體賦值。
指標與陣列名的區別
int a[10]
;int *p;
p=&a[0]
//可以寫成p=a;
對陣列元素a[i]的引用也可以寫成*(a+i)這種形式。
賦值語句p=&a[0]也可以寫成下列形式:p=a。
p是個指標,p[i]與*(p+i)是等價的。
區別:指標是乙個變數,可以進行數值運算。陣列名不是變數,不可以進行數值運算。
列舉是c語言中的一種基本資料型別,它可以讓資料更簡潔,更易讀。
列舉語法定義為:
enum 列舉名
注意:第乙個列舉成員的預設值為整型的0,後續列舉成員的值在前乙個成員加1。
enum season
;//沒有指定值的列舉元素,其值為前一元素加1
可以通過以下三種方式來定義列舉變數
1.先定義列舉型別,再定義列舉變數
enum
day;
enum
day day;
2.定義列舉型別的同時定義列舉變數
enum
dayday;
3.省略列舉名稱,直接定義列舉變數
enum
day;
在c語言中,列舉型別是被當作int或者unsigned int型別來處理的,所以按照規範是沒有辦法遍歷列舉型別的。
不過在一些特殊的情況下,列舉型別必須連續是可以實現有條件的遍歷。
列舉型別不連續,列舉無法遍歷。
C 學習第五天
c 中的is和as is可用於任何型別。例如 int a 10 a is object true object o 10 o is int true o person o is int false as右側型別必須為引用型別或可空型別。as操作如果失敗,不丟擲異常,而是返回null 結構 struc...
C 基礎 第五天
c 保留有效位數的方法.cout.precision 2 總的有效數字 cout.flags cout.fixed 小數點後面有效數字 cout.unsetf cout.fixed 復原輸入資料時,前面輸入錯誤,導致後面無法輸入.解決方法.過程和原理 include include include ...
學習C語言第五天記錄
由於前幾天電腦壞了,所以沒及時更新。今天我學習函式的一部分知識。首先是庫函式的定義以及用法,庫函式直接拿來用就行,其次就是自定義函式,就是自己寫的函式用來完成一部分功能,然後就是函式的呼叫有兩種,一是傳參呼叫,二是傳址呼叫,最後,明白了實參與形參。具體 如下 include int add int ...