c指標之四 指標和陣列

2021-09-25 07:08:24 字數 3150 閱讀 5440

/*陣列是c內建的基本資料結構

一、陣列概述

獲取元素數量的方式 : 陣列長度除以元素長度

*/ int icount = sizeof(vector) / sizeof(int)

/* 1、一維陣列

2、二維陣列

3、多維陣列

二、指標表示法和陣列

單獨使用陣列名字時候會返回陣列位址,可以把陣列賦值給指標

如 :*/int vector[5] = ;

int *pv = vector;

//只用陣列名字或者對陣列的第乙個元素用取位址操作符是等價的,都會返回vector的位址

printf("%p\n", vector);

printf("%p\n", &vector[0]);

/*陣列下標可以用在指標上,如pv[i]等價於 *(pv + i);

給指標加乙個整數,會把它持有的位址增加這個整數和資料型別長度的乘積,這一點對於給

陣列名字加上整數也適用,下面兩個語句等價

*(pv + i)

*(vector + i)

*///指標和陣列的差別

int vector[5] = ;

/*vector[i],*(vector + i)表達的值一樣,但是前者生成的機器碼是從vector開始,移動i個位置

後者則是從vector開始,在位址上增加i,兩者儘管結果一樣,但是生成的機器碼卻不一樣

分析下以下**

*/int *pv = vector;

pv = pv + 1; // 正確

vector = vector + 1; // 語法錯誤,修改了陣列所持有的位址

pv = vector + 1; // 正確

/*三、用malloc建立一維陣列

如果從堆上分配記憶體並把位址賦值給乙個指標,那就肯定可以對指標使用陣列下標,

並把這塊記憶體當成乙個陣列, 下面**中,複製之前的vector內容

*/int *pv = (int*)malloc(5 * sizeof(int));

for (int i = 0; i < 5; i++)

// 指標表示法

for (int i = 0; i < 5; i++)

```//注意:這種技術分配一塊記憶體,並把它當成陣列,其長度在執行時確定。不過,我們得記得要在用完之後釋放記憶體

/*四、用realloc調整陣列長度

c99標準支援變長陣列,如果,沒有c99,那就用realloc, 如果陣列需要的生命週期比較函式長

那也只能用realloc

練習1 : 實現乙個函式,從標準輸入字元並放入緩衝區,緩衝區會包含除最後的回車字元之外的所有

字元 如果realloc分配成功,不需要再釋放buffer,因為realloc會把原來的緩衝區複製到新的緩衝區中,

再把舊的釋放。如果試圖釋放buffer,十有**程式會終止,因為我們試圖重複釋放同一塊記憶體

練習2 : realloc函式也可以用來減少指標指向的記憶體。實現trim函式,把字串開頭的空白符刪掉

*//*

五、傳遞一維陣列

將一維陣列作為引數傳遞給函式實際就是通過值來傳遞陣列位址

如果不知道陣列長度,就無法處理器元素,最終結果可能是處理的元素太少,也可能

把陣列邊界的記憶體當成陣列的一部分,這樣往往會造成程式非正常終止

1、陣列表示法

*/void displayarray(int arr, int size)

}void testarray()

; displayarray(vector, 5);

}//注意:為了確定陣列元素數量,使用sizeof是不對的

//2、指標表示法

//<1>

void displayarray(int arr, int size)

}// <2>

void displayarray(int *arr, int size)

} //<3>

void displayarray(int *arr, int size)}/*

六、使用指標的一維陣列

指標陣列

*/void pointerarray()

// 等價表示法

*(arr + i) = (int*)malloc(sizeof(int));

**(arr + i) = i;

// 列印

for(int i = 0; i < 5; i++) }

/*七、指標和多維數

可以將多維陣列的一部分看做是子陣列,比如說,二維陣列的每一行都可以看做是

一維陣列

int maxtrix[2][5] = , };

注意兩點:

1、maxtrix返回的位址偏移了第一行的長度,20位元組

2、訪問陣列第一行第二個元素,*(maxtrix[0] + 1)

*//*

八、傳遞多維陣列

二維陣列當做引數傳遞

1、當做指標的陣列

//正確做法

void display2darray(int arr[5], int rows);

void display2darray(int(*arr)[5], int rows);

//錯誤做法

void display2darray(int *arr[5], int rows);

*/ /*

2、全部當做指標

// 宣告方式

*/void display2darrayunkonwnsize(int *arr, int rows, int cols)

void testuse()

/*

九、動態分配二維陣列

1、分配可能不連續的記憶體

*/void allocatememory()

}// 2、第二種技術,陣列所需要的所有記憶體是一次性分配的

void allocatememorywaytwo() }}

// 注意不能使用陣列下標

/*十、不規則陣列和指標

不規則陣列是每一行的列數不一樣的二維陣列

復合字面量是一種c構造,前面看起來像型別轉換操作,後面跟著換括號的

初始化列表

*/void irregulararray()

, (int) ,

(int) ;

}}

深入理解C指標之四 指標和陣列

原文 深入理解c指標之四 指標和陣列 陣列是c內建的基本資料結構,陣列表示法和指標表示法緊密關聯。一種常見的錯誤認識是陣列和指標完全可以互換,儘管陣列名字有時可以當做指標來用,但陣列的名字不是指標。陣列和指標的區別之一就是,儘管陣列的名字可以返回陣列位址,但是名字不能作為賦值操作的目標。陣列是能用索...

C 陣列 2 指標和陣列

1.陣列標準庫函式begin和end 這兩個函式與容器中的同名函式相類似,得到陣列首指標和尾指標.陣列不是類型別,所以不是成員函式.需要注意的是尾指標不能解引用和遞增操作.int a 5 int beg begin a beg指向a首元素的指標 int last end a last指向a尾元素下一...

5 3指標和陣列

定義乙個大小為10的陣列a 10 int a 10 包含了a 0 a 1 a 9 共計10個元素 定義指標 int pa pa指向陣列a的第0個元素,即pa為a 0 的位址。pa a 0 對陣列元素a i 的引用也可以寫為 a i 這樣的形式,這一點至少初看起來很令人吃驚。在求陣列元素a i 的值時...