程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++之路起航——指針,之路起航指針

c++之路起航——指針,之路起航指針

編輯:C++入門知識

c++之路起航——指針,之路起航指針


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號單元開始的四個字節。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved