陣列與指標

2022-08-09 00:42:18 字數 4838 閱讀 4185

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 #include 

34 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];

以下解釋型別的思想:

1

int *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元素的陣列。其實這兩種寫法主要是因為運算子的優先...