標籤:指標
指標的重要性
#include <stdio.h>/*指標的重要性:1,表示一些複雜的資料結構2,快速的傳輸資料3,使函數返回一個以上的值4,能直接存取硬體5,能夠方便的處理字串6,是理解物件導向語言中引用的基礎總結:指標是c語言的靈魂 指標的定義:地址:記憶體單元的編號從零開始的非負數整數範圍:如果是32位的機器就是從【0--4G-1】指標:指標就是地址,地址就是指標指標變數就是存放記憶體單元編號的變數,或者說指標變數就是存放地址的變數指標(0019FF38)和指標變數(p)是兩個不同的概念但是要注意:通常我們敘述時會把指標變數簡述為指標,實際含義並不一樣指標的本質就是一個操作受限的非負整數(不能加乘除,可以減) 指標的分類:1,基本類型指標int * p; // p是變數的名字,int *表示p變數存放的int類型變數的地址 // int *p 不表示定義了一個名字叫做*p的變數 // int *p 應該這樣理解:p是變數名,p變數的資料類型是int *類型 // 所謂int *類型實際就是存放int變數地址的類型 int i = 3;int j;p = &i; 1,p儲存了i的地址,因此p指向i 2,p不是i,i也不是p,更準確的說,修改p的值不會影響i的值,修改i的值也不會影響p的值 3,如果一個指標變數指向了某個普通變數,則 *指標變數 就完全等同於 普通變數 例子:如果p是個指標變數,並且p存放了普通變數i的地址則p指向了普通變數i *p 就完全等同於i或者說:在所有出現*p的地方都可以替換成i在所有出現i的地方都可以替換成*pprintf("%d\n",i); //輸出3printf("%d\n",*p); //輸出3*p 就是以p的內容為地址的變數 j = *p; printf("i = %d ,j = %d ,*p = %d \n",i,j,*p); //結果i = 3 ,j = 3 ,*p = 3 2,指標和數組3,指標和函數4,指標和結構體5,多級指標*/int main(void){return 0 ;}
常見錯誤1
#include <stdio.h>int main(void){int i = 5 ;int * p ;int * q;p = &i;//q = &i;//*q = p; //error文法編譯會出錯 在這裡*q是一個值,是一個int類型 而p是int * 是個地址,類型不一致,所以報錯//*q = *p; //因為q沒有賦值,相當於沒有地址,所以會分配垃圾地址,造成非授權訪問,為了避免非授權訪問,所以程式報錯// p = q; q是垃圾值,q賦給p p也變成垃圾值printf("%d\n",*q); //q的空間是屬於本程式的,所以本程式可以讀寫q的內容,但是q的內部是垃圾值,則本程式不能讀寫*p的內容return 0;}
常見錯誤2
#include <stdio.h>//把5賦值給了一個不知道的單元,所以程式報錯int main(void){int * p;int i = 5;*p = i;printf("p的地址是%p\n",&p);printf("i的地址是%p\n",&i);printf("*p的值是%d\n",*p);//printf("%d\n",*p);return 0;}
經典程式互換兩個數字
#include <stdio.h>/**號的含義:1,乘法2,定義指標變數3,指標運算子該運算子放在已經定義好的指標變數的前面如果p是一個定義好的指標變數則*p表示以p的內容為地址的變數 */void huhuan_1(int ,int );void huhuan_2(int * , int *);void huhuan_3(int * , int *);int main(){int a = 3 ;int b = 5;huhuan_1( a, b); printf("a=%d,b=%d\n",a,b); //a=3,b=5huhuan_2( &a, &b); //huhuan_2( a, b);錯誤;huhuan_2( *p, *q);也是錯誤的printf("a=%d,b=%d\n",a,b); //a=3,b=5huhuan_3( &a, &b); printf("a=%d,b=%d\n",a,b); //a=5,b=3return 0;}//不能完成互換void huhuan_1(int a,int b){ int t; t = a; a = b; b = t; return;}//不能完成互換void huhuan_2(int * p, int *q) //因為p和q才是變數,儲存的是地址,所以在主函數裡傳過來的也是地址,所以是huhuan_2( &a, &b); {int * t; t = p; p = q; q = t;}//可以完成互換void huhuan_3(int * p, int *q) {int t; //如果要互換*p和*q的值,則t必須定義成int,不能定義成int* 否則文法報錯 t = *p; //p是int * ,*p的int *p = *q; *q = t;}
c語言指標2