1、為什麼要使用指標?
變數的普通訪問方法:從記憶體的開頭,逐一向後查詢。
2、指標的理解
先要理解位址和資料,你可以想象有很多盒子,每個盒子有對應的號碼,那個號碼叫做「位址」,而盒子裡放的東西叫做「資料」。
把上面的過程理解了,p和*p的區別就不難解釋了。
p是指標變數,用來存放位址,你可以認為是上面所說的盒子的號碼,「 * 」是解引用操作符,你可以把它理解成開啟盒子,*p就是開啟p號盒子,取出裡面的資料。
簡單來說,p存放的是位址,而*p是讓程式去那個位址取出資料。
二、概念:
1、p是乙個指標變數的名字,指標變數p的值為指向的變數所在的記憶體起始位址(編號),如果使用%p來輸出的話,它將是乙個16進製制數,使用%d來輸出的話,它將是乙個10進製數,兩者轉換互等。
2、*p表示此指標指向的記憶體位址中存放的內容(即指標所指向變數的值)。
3、&p就是取指標自身p的位址(即指標變數p所在記憶體的位址),畢竟指標變數也是變數的一種。
4、int *p應該理解為(int *)p ,注意int* 也是一種變數型別它定義的是 p(同樣int **p理解為(int**)p), * 表示取位址上的資料。
5、指標的偏移p+1,改變的是p的值(資料),指標變數p自身在記憶體的位址(&p)不變。所有變數定義後,在記憶體的位址「&變數」不會隨資料改變。如下圖
三、例項對比測試:
1、分析比較p,*p,&p的值,理解指標中各個取值表示的意義。
2、不管十進位制還是16進製表示的記憶體,單位都是位元組(byte)。
printf("對比p,*p,&p的值:\n");
printf("p1的值:%d *p1的值:%d &p1的值:%d\n\n\n", p1, *p1, &p1);
printf("p1的10進製值:%d, 變數a[0]在記憶體中的起始位址(10進製):%d\n\n", p1,&a[0]);
printf("p1的16進製制值:%p,變數a[0]在記憶體中的起始位址(16進製制):%p\n\n", p1, &a[0]);
printf("\n\n");
system("pause");
return(0);
四、指標的使用
因陣列名a代表陣列的首位址(即a[0]的位址),當p1=a(即p1=&a[0]),則陣列元素a[i]的表達形式有p1[i]、*(p+i)、*(a+i)。
五、總結
5.1、指標變數p的值是位址,「*」為取資料符,*p表示取p所指向的位址中的資料,「&」為取位址符,指標變數p自身所在的記憶體(&p)位址及空間大小(4個位元組),與指標定義表示式中的資料型別無關。
5.2、假如定義int*p,char(*p)[2],double*p等,定義的是p指向的位址(p值)所在記憶體的資料型別,而不是定義p自身在記憶體(&p)資料及空間。
5.3、同樣的指標偏移p=p+1,改變的是指標變數p的值(也就是改變p的指向位址),偏移量與定義指標有關,其偏移大小為指標指向位址的資料型別長度(如int*、int(*)[2]),而自身變數p在記憶體位址(&p)及空間大小4個位元組不會改變。如下
int n[3][4] = ;
int(*p)[2] = n;
printf("%d\n",p); //p指向的位址。
printf("%d\n\n\n",&p); //變數p自身在記憶體的位址。
p = p + 1;
printf("%d\n",p); //定義p指向位址的資料型別為int(*)[2],所以偏移2個int。
printf("%d\n",&p); //指標偏移不會改變變數p自身在記憶體的位址。
C 語言 指標的概念與理解
我們知道,大多數現代計算機都將記憶體分割為位元組 byte 每個位元組儲存 8 位資訊。每個位元組都有乙個唯一的位址 可以把位址看作乙個數 我們可以把它看做乙個唯一的識別符號。這個位址是為了用來和記憶體的其他位元組相區別。這就是指標的出處了,我們雖然可以用數表示位址,為什麼不直接用普通整型變數來儲存...
C語言指標基本概念與理解
歡迎關注awp資訊 指標是c c 程式語言中的重要概念,但是對於初級程式設計師來說,指標是個比較難理解的概念,下面就從指標的概念入手,一點點解密指標。學習並理解指標首先已經具備基本的程式設計知識,能夠編寫c程式,對於變數知道如何定義並進行運算。要理解指標首先要對不同資料型別的變數在記憶體中是如何分配...
深度理解指標及相關概念
2.指標變數 指標變數是變數,具有儲存空間。就像int,float等型別一樣,當然,指標有別的變數不具有的特殊用法。1.指標的型別 我們將type 叫做指標的型別,type指的是指標所指向的型別,type是指最後乙個 之前所有的東西,例如 char p,它的type部分就為char char p,它...