1.陣列
陣列的初始化必須出現在定義語句中
如 int a[3] =
a 表示a[0]的位址,&a 代表陣列a的取位址。
內不可為負數。c/c++語言中陣列下標越界,編譯器不會檢查處錯誤,但是實際上會導致程式崩潰。
陣列也可以這樣表達:
int b[100] = ;//意思是b[0]到b[49]都等於100,b[50]到b[99]都等於200
(延伸:...也可以用於switch 中
如:switch()
)二維:int b[2][3]解析:第一部分 b[2], 第二部分 int [3];b是一維陣列,只不過其中的兩個要素都是乙個int [3]的一維陣列罷了
1.1變長陣列(不初始化的賦值)
int i = 3;
int a[i];
a[0] = 100;
1.2柔性陣列code1
1 #include 2 #include34 typedef struct
_soft_array
5softarray;910
intmain()
1121
22for(i=0; ilen; i++)
2326
27free(sa); //
釋放記憶體!!!必須記得
2829
return0;
30 }
* 柔性陣列即陣列大小待定的陣列
* c語言中結構體的最後乙個元素可以是大小未知的陣列
* c語言中一般由結構體產生柔性陣列
1.3字元陣列與字串
char s1[5] = ;
char s2[5] = ;
char s3[5] = "abc";//三個表示式所達到的效果一樣
任何陣列的名字代表了首元素的位址,即s1 = &s1
; 「abc」代表 a 字元的位址
,故有:字串變數和字元陣列,它們的變數名代表首字元位址
注意:字串預設有乙個null結束符,字元陣列沒有
printf("%c\n", s3[1]);
printf("%c\n", "abc"[1]);
--->延伸:常量字串是乙個匿名的字元陣列的名字
順便提一下 sizeof 和 strlen 的區別
sizeof(s2) = 3 //求s2字串有幾個字元(不包括'\0')
strlen(s2) = 5 //求s2有幾個字元 (包括'\0'和亂碼的字元)
2.記憶體位址(指標)
記憶體組織單元:位元組(32位的計算機有記憶體2^32個位元組)
2.1指標定義和初始化( 定義初始化分開寫也行 )
int * p = &a;
2.2指標賦值
int b = 200;
p = &b;
2.3取目標(解引用)
*p = 201;
==> b = 201;
2.4取位址
int *(*k);
k = &p;
*p = 202; ==> b = 202;
2.5加減法(陣列運算/指標運算)
int number[4] = ;
int *p;
p = number; //等價於p = &number[0]; 陣列運算時,陣列名字代表首元素的位址
p = p+2; //若p原來指向 0x008000,執行之後p指向0x008008.因為p是int *型別的。 //等價於p = &number[2];
以下解釋型別的思想:
1int *p1; //
p1是int *型別
2 p1 = &a; 34
5int *(*q); //
*q 是 int*的型別62
178 q = &p1; //
故寫成這樣是可行的
==》取得的函式或者變數的型別方法:是將函式/變數的名字蓋住,剩下的就是型別
如:int a[3]; 的型別是 int[3]
例子1:
int a[5] = ;
int (*p)[5];
p = &a; //此處的 a 代表整個陣列,取陣列a的位址,也就是取陣列第乙個元素的所在的位址
p =a; //此語句錯誤!!!!!因為p指向整個陣列a的,因為p的型別是int [5] 的指標,只能用來指向整個陣列,不可以用來指向乙個變數
例子2:
float f[5] = ;
float (*p2)[5] = ;
==> p2 = &f; //p2指向float的整體(f在此處不看做位址,而是乙個陣列的名字) *p2 = f; p2 = &f;
因此,f[2] = 30;
可以寫成: (*p2)[2] = 30;
匿名記憶體:malloc
int *p = malloc(100);//malloc分配的記憶體是沒有名字的,然後給它定義型別 int * 和名字 p
3.函式指標
函式宣告
int sumup(int a, float b);
int (*p3) (int a, float b); //指標p3使用來指向函式sumup的
【回顧:兩者的型別都是 int (int a, float b);】
int* (*p4)(int a, float b);
從型別上看,int* (int a, float b) 是上式函式的指標。故有:p4 = &p3;
函式的呼叫
sumup (100,1.21);
(*p3) (100,1.21); //與上等價
*(p4) (100,1.21); //與上等價
4.void指標
(通常用於在分配完成後,不知是什麼型別的指標。好處在於:void指標可以賦值給任何型別的指標)
定義與初始化:
void * p5 = malloc(100);//malloc函式就是乙個void指標
在記憶體中放置資料需轉化記憶體
int i;
for(i=0; i<25; i++)
一共25個int型資料
}
5.空指標
表達形式:
int *p6 = null;
int *p7 = 0;
6.const指標
在c語言中不可以用來定義常量
const int b;
int const b; //等效上式
(在c++中,const int globle ;為const常量)
只能在初始化的時候賦值 !
int const b = 5;
在指標應用中,const前後的差別:
-->可以通過p來修改目標
const char *p = &b;
char const *p = &b;
-->p本身不能修改
char *const p = &b;
指標與陣列,指標陣列 陣列指標
int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...
指標陣列與陣列指標
1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...
指標陣列與陣列指標
呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...