c語言指針2
阿新 • • 發佈:2018-05-27
指針
指針的重要性
#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的地方都可以替換成*p printf("%d\n",i); //輸出3 printf("%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=5 huhuan_2( &a, &b); //huhuan_2( a, b);錯誤; huhuan_2( *p, *q);也是錯誤的 printf("a=%d,b=%d\n",a,b); //a=3,b=5 huhuan_3( &a, &b); printf("a=%d,b=%d\n",a,b); //a=5,b=3 return 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