標籤:
C語言第12輪:指標
【學習目標】
1. 指標
2. 指標與數組
A: 指標的概念
記憶體儲存單元按位元組排序。每一個位元組編有序號。我們稱之為地址。因為能夠通過地址就能夠找到所要的記憶體單元,所以我們把地址成為指標。指標是個特殊的變數,它裡面儲存的數值被解釋為記憶體裡的一個地址
作用:
(1) 指標能夠有效地表示複雜資料結構,如隊列、棧、鏈表等
(2) 指標能夠像彙編一樣處理記憶體位址,為動態記憶體分配提供支援
(3) 指標能夠實現對數組和字串的方便使用,提高程式的效率
B: 指標變數的定義
資料類型 * 指標變數;
如:
int*p2; /*p2是指向int型的指標變數*/ float*p3; /*p3是指向float型的指標變數*/ char*p4; /*p4是指向char型的指標變數*/
說明:資料類型並非指變數本身的類型,而是該變數所指向目標變數的類型。指標變數僅僅能指向同類型的變數。
//指標的定義#include <stdio.h> int main( void ){ //野指標:不是NULL指標,是向被釋放的或者訪垃圾記憶體的指標 int *ptr1; //ptr1為int型指標,野指標,裡面為垃圾地址 char *ptr2; //ptr2為char型指標,野指標,裡面為垃圾地址 //在VC中編譯,會提示ptr1和ptr2沒有初始化 float*ptr3= NULL; //ptr3為float型指標,不是野指標,已經初始化為NULL //查看地址 printf("( ptr1 )= %p\n", ptr1 ); printf("( ptr2 )= %p\n", ptr2 ); printf("( ptr3 )= %p\n", ptr3 ); return 0; }
C: 指標的賦值(注意:類型要匹配)
(a)使用地址運算子&:
如:
int a =133;int * p1;p1= & a; //使用地址運算子把a的值賦值給指標p1
(b)將一個已具有指向的指標變數賦值給還有一個指標變數
如(接上面的):
int* p2;
p2=p1; //p1和p2同一時候指向變數a
(c) 指標與數組的賦值
int a[5],*pa; pa=a; //(數組名表示數組的首地址,故可賦予指向數組的指標變數pa) //也可寫為: pa=&a[0]; //數組第一個元素的地址也是整個數組的首地址, //當然也可採取初始化賦值的方法: int a[5]; int *pa=a;
(d) 字串與指標的賦值。
比如:
char *pc; pc="C Language"; //或用初始化賦值: char *pc="C Language";
PS: 不同意把一個數直接賦予指標變數。
如:
int *p; p=1000; //類型不符。提示錯誤 //改進方式 P= ( int * )100; //強制類型轉換。
D: & 和 * 的使用
(a) 合法的使用取地址符能夠得到一個變數的地址
如:
int a; int score[5]= {80, 90, 97, 98, 63}; &a,&score[0]; //該操作合法 &(a+5); // 該操作非法,越界 &a=123; //該操作非法,須要的話必須的強制轉換 &score; //該操作非法,score本身代表score的首地址
(b)使用* 運算子,間接存取指標所指向的目標標變數的值(類型要匹配)
itn a = 234;int * p1;p1=& a; //p1指向數組aprintf(“%d\n”, *p ); //符號*是把地址中的內容取出。
E: 指標與整數相加減
意義:表示指標的移動
如: p+n p-n p++ p-- ++p --p
PS:
(1) 當中的n為整數。地址的移動不能為小數。
(2) 加法表示指標p向地址增大的方向移動。
(3) 減法表示指標p向地址減小的方向移動
(4) 至於移動的長度,是由電腦決定。
如:設p是指向type(類型)類型的指標。n為整型運算式,則p+(或—)n為一個新的地址。其值為p+(或-)n*sizeof(type)。
F: 指標與數組
因為數組中的各元素的儲存單元是連續分配的。因此能夠用指標來訪問數組,數組名就是該數位首個地址。
如: int a[]=“abcdefg”;
a 就是該數組的首地址。等價於&a[0]
PS: 通過收地址,能夠非常快的、方便的訪問數組中的其它元素。方法例如以下:
首地址+ 位移量
a[ i ]能夠轉化為: *(a+i), *(&a[0]+i)
指標與數組的比較 |
指標 |
數組 |
儲存資料的地址,不論什麼存入指標變數的資料都會被當做地址來處理。 |
儲存資料。數組名為數組首元素的首地址。 |
間接訪問資料。通過擷取指標變數中的內容(地址),然後從這個地址提取資料。 指標能夠使用指標形式訪問資料,也能夠使用下標形式訪問資料。 |
直接訪問資料。能夠通過指標的形式訪問資料,也能夠使用下標訪問資料。 |
通經常使用於動態資料結構 |
通經常使用於儲存固定數目 |
使用malloc,calloc,recalloc和free函數分配記憶體 |
不能刪除分配的記憶體,能夠刪除資料 |
【指尖的微笑】錯誤在所難免。希望得到大家的指正^-^
轉載時保留原文的連結(http://it.bangedushuren.cn/)原創,轉載請註明
著作權聲明:本文皆有[www.bangedushuren.cn]原版的,轉載請註明http://dh.51zhui.cn/,謝謝
C語言第12輪:指標