注:本文是對蘇小紅版c語言程式設計第11章的筆記
陣列名代表陣列元素的連續儲存空間的首位址,即指向陣列中的第乙個元素的指標常量。e.g.: a <=>&a[0], *(a + i) <=>a[i]
不能對陣列名執行增1或減1的操作(a是指標常量)
p + 1 和p++本質上是不同的操作:雖然二者都對指標變數p進行加1運算,但p+1不改變指標的指向,而p++相當於執行p = p + 1
p++加上的是1*sizeof(基型別)
行指標:a[i][j] <–>* (a[i] + j) <–>* (* (a + i) + j) <–> *(a + i)[j]
二維陣列中a[i]可以看成由a[i][1]…a[i][n]構成的一維陣列的陣列名,代表陣列的首位址
列指標:a[i][j] <–>*(p+i * n+j) <–>p[i * n + j]
對比以下三種函式引數:
void input(int a[n], int m, int n);//二位陣列作函式引數
void input(int (*a)[n], int m, int n);//二位陣列行指標作引數
void input(int *a, int m, int n);//二維陣列列指標作引數
指標陣列:元素是指向同一型別元素的指標,最主要用途之一就是對多個字串程序處理操作
使用前必須進行初始化
#include int main(int argc, char *argv)//argc:命令列中引數個數 agrv:接收命令列引數
}return 0;
}
c中變數的分配:
從靜態儲存區分配(編譯時分配,終止前收回):
全域性變數和靜態變數
在棧上分配:
效率高,容量有限,可能出現棧溢位從而使程式執行失敗
從堆上分配:
動態記憶體申請的記憶體
生存期由程式設計師決定,使用靈活,容易出現記憶體洩漏等問題
必須及時free()已不再適用的記憶體
動態記憶體分配函式
malloc():void *malloc (unsigned int size);
...
int *pi = null;
pi = (int *)malloc(sizeof(int));//用強轉的方法將返回的指標值轉為所需型別, 適用sizeof有利於提高可移植性
calloc():用於給若干同型別資料項分配兩虛的儲存空間並賦值為0
原型:void *calloc(unsigned int num, unsigned int size);
float *pf = null;
pf = (float*)calloc(10, sizeof(float));
free(): void free(void *p);
realloc():void realloc(void *p, unsigned int size);
用於改變原來分配的儲存空間的大小, 返回值是新分配的儲存空間的首位址,與原來分配的首位址不一定相同。
常見錯誤:
記憶體未分配成功就適用
記憶體分配成功了,但未初始化就適用
記憶體分配成功了, 也初始化了,但發生了越界使用
忘記了釋放記憶體,造成記憶體洩漏
釋放記憶體後仍然繼續使用(使用野指標)
野指標形成的主要原因:
指標操作超越了變數的作用範圍
指標變數未被初始化
指標變數所指向的動態記憶體被free後未置為null
解決對策:
不把區域性變數的位址(指向「棧記憶體」的指標)作為函式的返回值返回
在定義指標變數的同時對其初始化,要麼設定為null,要麼使其指向合法記憶體
盡量把malloc()集中在函式的入口處,free()集中在函式的出口處
C語言複習 指標和陣列
include include 陣列是一塊連續的記憶體空間 陣列名 就是記憶體空間的首位址 陣列名 i 陣列名 i main printf a 0 d n arr 0 printf a 4 d n arr 4 邏輯上是錯誤的 陣列下標越界 printf a 5 d n arr 5 windows x...
C語言指標陣列和陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...
C語言指標陣列和陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...