c語言的指針的存在使得c語言對硬件的操控,以及靈活性獲得了極大的提升。數組
可是指針的使用存在着不少難點問題。函數
#include<stdlib.h> #include<stdio.h> //這裏的函數是指針作參數的例子,要知道這個特性能夠彌補c語言只能有一個返回值的特性。 void swap1(int *pa,int *pb){ int t =*pa; *pa=*pb; *pb=t; } //main()函數必需要返回一個數字 int main(){ int a =15; int b=10; int* t; t=&b; a=b; b=*t; printf("%d\n",b); swap1(&a,&b); printf("%p\t%p",a,b); return 0; }
這裏咱們先定義兩個整型的變量a,bspa
而後再定義一個臨時的指針變量,用來存儲中間變量指針
而後將b的變量的內存地址賦值給t,注意這裏 t 表明的是內存地址code
而後把b的值給a,再用b接受t地址所存儲的變量, 注意這裏的*t是指t這個地址所指的那個變量。blog
指針與數組內存
其實數組的int a[10];io
裏來講a實際上是這個數組的第一個元素的a[0]的指針編譯
因此數組變量自己就是表達地址,因此class
1 int a[10]; 2 int *p=a; //無需用&取地址 3 4 可是數組的單元表達的是變量,須要用&取地址 5 a==&a[0]; 6 7 []運算符能夠對數組作,也能夠對指針作: 8 9 10 p[0] <==>a[0]; 11 這裏的p[0]至關於*p 12 13 *a能夠表示a[0] 14 15 數組變量是const的指針
const 這個修飾符的做用就是代表一個變量是指定的值不能改變了
int* const p=&i; //p是const *q=26;//OK q++; //ERROR
1 int ls=58; 2 int ls1=64; 3 int* const q=&ls; 4 *q =10; 5 *q=20; 6 // q = &ls1; 這句是不能經過編譯的,由於這個指針是不能指向其餘位置的地址 7 //執行成功說明這裏的指針變量是能夠被改變的 8 ls=36 ; 9 printf("\n%d",*q); 10 //而後咱們來看另一種狀況 11 int P1=10; 12 int P2=20; 13 int const *T=&P1; 14 T=&P2;//執行結果爲30 15 //*T =15;這裏是不能經過編譯的,由於這個指針指向的位置存儲的變量是不能賦值改變的。 16 P2=30; 17 printf("\n%d",*T); 18 //關鍵在於這裏的const是在*的前面仍是後面決定的 19 return 0;
1 void mai(const int*p){ 2 3 int *ls=*p; 4 printf("ls的地址:%p",ls); 5 } 6 這裏咱們傳入了一個指針,可是在函數裏,是不能改變這個指針所指向的值的
指針的運算
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main(){ 5 int i,j; 6 i=10;j=12; 7 printf("i,j:%d,%d\n",&i,&j); 8 printf("i,j:%d,%d",*&i+1,&j); 9 printf("\n&i-&j:%d",(&i)-(&j));//這裏兩個地址作差實際上是地址差/類型所佔的位數 10 11 int *p; 12 p=&i; 13 *p++;//其實是*(p++);++優先級比*高;數組遍歷 14 printf("\n*p:%d",*p); 15 return 0; 16 }
指針的類型轉換
void*表示不知道指向什麼東西的指針
指針變量的大小是相同的可是,指針是有類型的差異
總之指針的做用
1、須要傳入較大的數據的時候用作參數 2、傳入數組後對數組作操做 3、函數返回的結果不止一個的時候能夠用指針帶出(c只能return一個變量,或者值) 須要要用函數來修改不止一個變量 4、動態申請內存.......
具體的後續會更。