c++一階指針
定義
存儲類型名 數據類型 * 指針變量名;
Eg:int *a;//定義了一個指向整型的指針 a;
指針使用方法
int a,*b;
b=&a;//表明將a的地址賦值給b;
*b=5; //將b指針所指向的地址賦值給5;即等同於a=5;
指針使用前必須賦一個合法的值 int *a,b; *a=5;//這種表達方式是錯誤的,因為沒有對a進行初始化,而就進行賦值。 void *a//萬能指針,可以接受任何類型的指針, int *a; void *b; char *c; b=a;//正確,因為void指針可以接受任何類型的指針 a=b;//錯誤,因為void指針不能直接賦值給其他類型指針 正確寫法應為a=(int *)b;將b強制類型轉換為整形指針,在復制; c=(char *)b;//正確; 二階指針//二階指針,顧名思義,既為指向指針的指針; 定義:存儲類型 數據類型 ** 指針變量名 Eg int **p;//二階指針 #include<iostream> Using namespace std; int main(){ int i,*q,**p; i=123,q=&i,p=&q;//簡單解釋一下二階指針, cout<<**p; return 0; } 指針函數傳值 void swap(int *x,int *y){} int main() {int a,b,*p=&a,*q=&b; swap(p,q); swap(&a,&b); 指針數組與數組指針 指針數組 int *p[10];//定義了一個指針類型的數組,數組中每一個元素都為一個指針類型; 數組指針 int(*p)[10];// 定義了一個指向數組的指針; #include<iostream> #include<cstdio> using namespace std; int main() { int a[2][5]={1,2,3,4,5,6,7,8,9,0}; int (*p)[5]=a; cout<<"*p[1]="<<*p[1]<<endl; cout<<"*(p[1]+1)="<<*(p[1]+1)<<endl; char *q[5]={"a","b","c","d","e"};//指針數組這樣初始化dev會有警告,但vc不會有任何警告;不建議讀者用這種初始化。 cout<<"q[1]="<<q[1]<<endl;//因為q[10]為指針類型數組,所以q中存儲的為地址。 return 0; } 指針函數與函數指針 指針函數//返回值為指針的函數; 定義:類型名 * 函數名(參數列表); Eg:int * max(int *x,int *y); { returen *x>*y?x:y; } 函數指針//算法競賽中基本不用,只順便提一下,既為指向函數的指針; 定義:函數類型 (*指針名) (函數形參表); Eg int max(int x,int y){return x>y?x:y;} int min(int x,int y){return x<y?x:y;} int main() { int a=1,b=2; int (*p)(int,int); p=max; cout<<p(a,b);//也可以寫成(*p)(a,b),其中*運算沒有意義 p=min; cout<<p(a,b); return 0; } 指針與數組 c++中數組名既為一個地址;故可以賦值給指針變量; Eg int a[10];*p; p=a;//正確; 二維數組—特殊的二階指針; int b[10][10]; 將二維數組理解為矩陣; b為二階指針; b所指位置為行,稱為行指針; 對b進行一次*運算,便轉換為列指針,從而確定每一個元素所在位置。 int a[10],*b; b=a;// 正確,b++;就相當於地址向右移動,b--就相當於地址向左移動,<,>,>=,<=,!=在指針運算中也適用 int a[10][10],**b; b=a;//這種方式是錯誤的. int a[10][10],(*b)[10]; b=a;//正確。 int *(*P)[10];//指向指針數組的數組指針char a[20];
int *ptr=(int *)a; ///強制類型轉換並不會改變a的類型
ptr++;
在上例中,指針ptr的類型是int*,它指向的類型是int,它被初始化為指向整型變量a。接下來的第3句中,指針ptr被加了1,編譯器是這樣處理的:它把指針ptr的值加上了sizeof(int),在32位程序中,是被加上了4,因為在32位程序中,int占4個字節。由於地址是用字節做單位的,故ptr所指向的地址由原來的變量a的地址向高地址方向增加了4個字節。
由於char類型的長度是一個字節,所以,原來ptr是指向數組a的第0號單元開始的四個字節,此時指向了數組a中從第4號單元開始的四個字節。