謹以此文送給初入程式設計坑的女票梁童鞋。
目錄
基本概念
位址和指標的關係
指標操作
指標運算
指標與陣列
指標與一維陣列
指標與二維陣列
指標陣列
指標:是指向另一變數在記憶體中位置的位址。在程式中定義乙個變數,進行編譯時就會給這個變數在記憶體中分配乙個位址,通過訪問這個位址即可以找到所需變數,這個變數的位址就稱為該變數的指標。
指標的定義
型別宣告 * 指標變數名
「 * 」表示是乙個指標變數,「型別宣告」表示本指標所指向
的資料型別(基本型別、陣列、函式、指標、物件)。
指標的型別是「型別宣告 *」(去掉指標變數名的剩餘部分) ,指標指向的所指向的型別「型別宣告」(去掉指標變數以及左側的指標宣告符*)。
指標賦值
指標變數同普通變數一樣,使用之前要定義,而且必須賦具體的值,未經賦值的指標變數不能使用。給指標變數進行賦值只能賦予位址
,而不能賦予其他任何資料。主要有以下兩種賦值方式:
//定義指標變數的同時進行賦值
int a;
int *p=&a;
//先定義指標變數,然後再賦值
int a;
int *p;
p = &a; //注意p前不要加符號*
注意:定義完指標變數之後再賦值,不要加「 * 」。
指標的引用(*p)
引用指標變數是對變數進行間接訪問的一種形式,其含義是指標變數所指向的變數的值。引用形式如下:
*指標變數
int *p,q=5;
p = &q; //&稱為取位址運算子,&q即獲取變數q的位址。
printf("%d",*p); // *p 是q的值,*p == q
算術運算
指標只有加法減法兩種算術運算,指標的運算都是相對其基本型別進行的。
int i;
int *p = &i;
p++; //位址加1,這裡的1代表乙個整型的長度。16位系統中int是2個位元組,32位系統int是4個位元組。
char j;
char *q = &j;
q++; //位址加1,這裡的1代表乙個字元的長度即乙個位元組。
編寫程式時一定要注意,指標型別要與指標所指向的型別要一致。
比較運算
在關係表示式中允許指標的比較運算,本質上是位址的關係比較,是否是在同一位置、在某位置前後。
下標運算
c語言提供了指標變數的下標運算「 [ ] 」,其形式類似於一維陣列元素的下標訪問形式,假設指標p,p[ i ]的意思是p後第i個位址處的值,p[ i ]等價於 *(p+i)。
當定義乙個一維陣列,系統會記憶體中為該陣列分配乙個儲存空間,其陣列的名稱就是陣列在記憶體中的首位址。若再定義乙個指標變數,將陣列的首位址傳給指標變數,則該指標就指向了這個一維陣列。
int a[10],*p;
p = a;
這裡a是陣列名,也就是陣列的首位址。
int a[10],*p;
p = &a[0];
a[0]是陣列的首個元素,其位址也就是陣列的首位址。
以上,將陣列名或者將陣列的首個元素的位址賦值給指標變數p的效果是完全相同的。
通過指標來引用一維陣列中的元素:
*(p + n) 與 *(a + n)均可以表示陣列a中的第n個元素。陣列名雖然很多時候可以當作指標來操作,但不是指標,它所代表的就是陣列這種資料結構。
int main()
; p = a;
printf("%d\n", sizeof(a)); //輸出40 sizeof返回型別或者物件占用記憶體的位元組數
printf("%d\n", sizeof(p)); //輸出4
return 0;
}
注意:
1. p = &a會出現警告,間接(" * "又稱間接定址運算子)(指向)級別不同的警告
int a[10],*p;
p = &a; //會出現"int *"與"int (*)[10]"間接(指向)級別不同的警告。
指標p指向的型別是int型,不存在&a的操作(取位址的位址),int (*)[10]是二維陣列的指標型別。
2. 盡量不要用陣列名當作指標引數傳入函式後,直接來進行加減法操作。可再定義乙個指標指向該引數,再進行操作。
//假設主函式中定義
int a[3]=
int fun(int*p)
輸出分析:前面下標運算中講到,p[ i ]等價於 *(p+i),在經過p = p+1後,p[1]的值相當於(a+1)[1]處的值。
3. 使用指針對陣列經過一迴圈操作後,在再利用該指針對該陣列操作時一定要考慮指標是否要重新指向陣列首位址。如,利用指針對陣列進行改值或排序之後,再利用指標進行陣列元素輸出。
1. 二維陣列的首位址
a : 陣列名,
2. 二維陣列的首個元素
**a*(a[0] + 0) = *(*(a + 0)+ 0)
a[0][0]
3. 二維陣列第m行的位址
a[m] = &a[m] = *(a + m) = a + m
4. 二維陣列第m行第n列的元素(
*(a+i)等價於a[ i ])
a[m][n] = *(a[m] + n) = *(&a[m] + n) = *(*(a + m) + n) = *((a + m) + n)......利用第3條替換
5. 二維陣列第m行第n列的元素的位址(
a+i等價於&a[ i ])
&a[m][n] = a[m] + n = &a[m] + n = *(a + m) + n = (a+m) + n .......利用第3條替換
注意:假設有,二維陣列 a[3][5],首位址a為1000。
則a+1 = 1004
1020 (1000+4*5) a+1表示陣列a第1行的位址。因此可以看出,此處+1是指在首位址加上二維陣列中每一行所有元素佔的位元組數。
二維陣列指標的定義(指向二維陣列的指標)了解即可。
型別說明符 (* 指標變數名) [長度]
其中「型別說明符」為所指陣列的資料型別。「 * 」表示其後的變數型別是指標型別。「長度」表示二維陣列分解為多個一維陣列時一維陣列的長度,也就是二維陣列的列數。應注意「(
* 指標變數名
) 」兩邊的括號不可少,如果缺少括號則表示是指標陣列(如下),意義完全不同。
指標陣列也是陣列,但它和一般的陣列不同,其陣列元素是指標,即記憶體單元位址。
資料型別 * 陣列名[常量表示式];
未完待續。。。 C語言指標整理
記憶體是按照位元組編址的,所以它的定址單位是位元組 byte 而乙個位元組又有是由8位 bit 的0或1組成。所以這樣的話4gb記憶體的定址空間就從0x00000000到0xffffffff,總共有 明白記憶體位址後,指標實際上就是記憶體位址,指標變數則是儲存指標的變數,也即是儲存了記憶體位址。下面...
整理C語言指標
指標的靈活運用使得c語言更加強大,指標是c語言中十分重要的部分,可以說指標是c語言的靈魂。當然指標不是萬能的,但沒有指標是萬萬不能的,有些操作沒有指標是辦不到的,如動態記憶體分配。鑑於學習指標的必要性,好好整理一下哈哈哈 1 指標 我們使用的計算機記憶體為8g,系統為了更好地管理我們的記憶體,就為記...
C 語言知識整理
c 語言知識整理 前言 c語言語法即關鍵字的使用方法 1.關鍵字介紹如何處理01 記憶體意識 1.關鍵字分類 2.變數符號實質宣告 定義 賦值 3.型別符號的使用struct union enum typedef 4.符號修飾關鍵字extern volatile static const restr...