C 陣列和指標

2021-05-26 17:30:00 字數 2884 閱讀 5078

它們很像vector和迭代器,c++程式盡量用vector和迭代器,除非有速度上的要求。

一、陣列

陣列是由型別名識別符號維數組成的符合資料型別。

1.定義和初始化需要注意的地方

(1)陣列長度是固定的,在編譯之時就已確定好。

(2)陣列的維數必須用值大於等於1的常量表示式定義(千萬不能用變數),此常量表示式只能包含整型字面值常量、列舉常量、用常量表示式初始化的整型const物件。換句話說就是要滿足兩個條件

(3)陣列元素初始化時,若沒有顯式提供元素初值,則元素會被想普通變數一樣初始化:

#includeint a[3]=;//5 0 0

int b[3];//0 0 0

void main()

;//5 0 0

int d[3];//隨機

}

(4)陣列不支援直接賦值和複製。

2.陣列操作

(1)陣列下標從0開始,型別為size_t,下標不可越界(編譯器並不檢查)

(2)陣列名其值為指向該陣列的指標值(即陣列首元素按的位址值),但陣列名還包含著陣列的長度,元素的型別兩方面的資訊。作為函式引數傳遞之後,退化為指標,丟失陣列長度資訊。

二、指標

1.定義與初始化

int * a;

int* a;

int *a;//上面定義三種都可以

而且,對於內建型別而言,int型指標只能指向int型變數。同一行定義兩個指標必須這樣:int *p1,*p2;不可這樣:int * p1,p2。所以說,定義的風格還是統一為第三種的好。

指標值為0表示他不指向任何物件,可以通過數值0或在編譯時值為0的const量以及null(cstdlib)來初始化,萬不可通過整型變數來賦值,即使它可能為0。

double obj = 3.14;

void *pd = &obj; //obj can be an object of any type

2.指標的操作

(1) 解引用生成左值

(2) 指標同引用的差別:這就像是指標常量與指標變數之間的差別,引用一旦定義必須初始化,之後它指向的物件就再不可改了。

(3) 指標可以指向指標

int ival = 1024;

int *pi = &ival;

int **ppi = π//ppi points to a pointer to int

int *ppi = π//error,can't convert to "int *" from "int **"

(4) 可以使用指標訪問陣列元素:在表示式中使用陣列名時,該名字會自動轉換為指向陣列第乙個元素的指標,這時要注意指標的算術操作,指標可以+(-) n(int 型),兩指標可想減,結果為ptrdiff_t型別(cstddef標頭檔案),使用下標訪問陣列時,實際上是使用下標訪問指標。

【例題】寫出如下程式片段的輸出。

int a = ;

int *ptr = (int*)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));

【答案】2,5

【解析】a看做指向int型別的指標,型別為int*;&a可看作指向int型別的指標,型別為int*。(&a+1)指向的是第六個位置(其實不存在)。陣列名a代表指向陣列首元素的位址,&a代表整個陣列的位址。

3.const和指標

(1)指向const物件的指標——常量指標

下面兩種方式定義都可以,推薦第一種。

const int *ptr1;

int const *prt2;

ptr1,ptr2本身的值可以修改,所以在定義時可以不初始化,允許其被重新賦值而指向另乙個物件。

另外注意,常量指標即「自以為指向const量」的指標:

(2)const指標——指標常量

其本身的值不能修改。

int a=0;

int *const pa=&a;

這意味著pa再也不能指向其他的物件。與任何const量一樣,const指標也必須在定義時初始化。

4. 指標懸浮和記憶體洩露

(1) 指標懸浮,指標迷途或者 wild pointer 同指該指標指向的記憶體沒有由程式分配到這個指標之上。

(2) 記憶體洩露通常是由系統將記憶體分配給指標,但之後指標卻不再指向那個地方了。那塊記憶體變成一塊死記憶體了。 

1. 關於字元陣列和字元指標

定義方法不同:

char str[10];

char *ptr;

賦值方法不同:

char str[10];

str = "china";//error

strcpy(str, "china");//ok

char *ptr;

ptr = "china";

字元指標是變數,而陣列名是位址常量。

c 陣列指標和指標陣列

先記住 指標陣列 本質是陣列,資料可以用來存放int float等物件,當然也可以存放指標。例子 陣列指標,用樓上的話就是指向陣列的指標,操作指標就可以運算元組如下 int a 3 int p a printf 陣列指標 d n p 1 列印的結果為2,原因是p初始化指向了陣列a的首位址,即a 0 ...

C 筆記 C 陣列指標和指標陣列

char p 10 為陣列指標,實際上相當於二維陣列,也就是指向乙個一維陣列的指標 p可以單獨看做指向陣列的指標 比如這樣 int b 2 int cc 2 2 1,2 3,4b cc b cout 這樣的賦值是可以的,b指向的陣列的大小一定要和cc的第一維陣列大小一致,這裡輸出,4,因為b 這個時...

C語言 指標陣列和指標陣列

本質是陣列 只不過呢,它裡面存放的資料型別不是int,也不是char這類基本型別,而是乙個指標型別,說白了就是位址,所以叫指標陣列!記住 是存放指標的陣列!int p n 本質是指標 只不過是指向乙個陣列的指標,也稱之為 行指標 int p n p是乙個指標,指向乙個int型別的一位陣列,這個一位陣...