指針變量幾個問題的進一步說明

  • 2017-09-07
  • 33

西安做網站指針變量幾個問題的進一步說明

指針變量可以進行某些運算,但其運算的種類是有限的。它隻能進行賦值運算和部分算術運算及關係運算。

指針運算符

取地址運算符&:取地址運算符&是單目運算符,其結合性為自右至左,其功能是取變量的地址。在scanf函數及前麵介紹指針變量賦值中,AG娛樂已經了解並使用了&運算符。

取內容運算符*:取內容運算符*是單目運算符,其結合性為自右至左,用來表示指針變量所指的變量。在*運算符之後跟的變量必須是指針變量。

需要注意的是指針運算符*和指針變量說明中的指針說明符*不是一回事。在指針變量說明中,*是類型說明符,表示其後的變量是指針類型。而表達式中出現的*則是一個運算符用以表示指針變量所指的變量。

【例10.6】

main(){

  int a=5,*p=&a;

  printf ("%d",*p);

}

 

    表示指針變量p取得了整型變量a的地址。printf("%d",*p)語句表示輸出變量a的值。

指針變量的運算

賦值運算:指針變量的賦值運算有以下幾種形式。

指針變量初始化賦值,前麵已作介紹。

把一個變量的地址賦予指向相同數據類型的指針變量。

例如:

int a,*pa;

pa=&a;    /*把整型變量a的地址賦予整型指針變量pa*/

把一個指針變量的值賦予指向相同類型變量的另一個指針變量。

如:

    int a,*pa=&a,*pb;

    pb=pa;    /*把a的地址賦予指針變量pb*/

由於pa,pb均為指向整型變量的指針變量,因此可以相互賦值。

把數組的首地址賦予指向數組的指針變量。

例如:

    int a[5],*pa;

    pa=a;

    (數組名表示數組的首地址,故可賦予指向數組的指針變量pa)

也可寫為:

    pa=&a[0];  /*數組第一個元素的地址也是整個數組的首地址,              也可賦予pa*/

當然也可采取初始化賦值的方法:

    int a[5],*pa=a;

把字符串的首地址賦予指向字符類型的指針變量。

例如:

    char *pc;

    pc="C Language";

或用初始化賦值的方法寫為:

    char *pc="C Language";

這裏應說明的是並不是把整個字符串裝入指針變量,而是把存放該字符串的字符數組的首地址裝入指針變量。在後麵還將詳細介紹。

把函數的入口地址賦予指向函數的指針變量。

例如:

    int (*pf)();

    pf=f;     /*f為函數名*/

加減算術運算

    對於指向數組的指針變量,可以加上或減去一個整數n。設pa是指向數組a的指針變量,則pa+n,pa-n,pa++,++pa,pa--,--pa運算都是合法的。指針變量加或減一個整數n的意義是把指針指向的當前位置(指向某數組元素)向前或向後移動n個位置。應該注意,數組指針變量向前或向後移動一個位置和地址加1或減1在概念上是不同的。因為數組可以有不同的類型,各種類型的數組元素所占的字節長度是不同的。如指針變量加1,即向後移動1 個位置表示指針變量指向下一個數據元素的首地址。而不是在原地址基礎上加1。例如:

    int a[5],*pa;

    pa=a;      /*pa指向數組a,也是指向a[0]*/

pa=pa+2;   /*pa指向a[2],即pa的值為&pa[2]*/

指針變量的加減運算隻能對數組指針變量進行,對指向其它類型變量的指針變量作加減運算是毫無意義的。

兩個指針變量之間的運算:隻有指向同一數組的兩個指針變量之間才能進行運算,否則運算毫無意義。

兩指針變量相減:兩指針變量相減所得之差是兩個指針所指數組元素之間相差的元素個數。實際上是兩個指針值(地址)相減之差再除以該數組元素的長度(字節數)。例如pf1和pf2是指向同一浮點數組的兩個指針變量,設pf1的值為2010H,pf2的值為2000H,而浮點數組每個元素占4個字節,所以pf1-pf2的結果為(2000H-2010H)/4=4,表示pf1和 pf2之間相差4個元素。兩個指針變量不能進行加法運算。 例如,pf1+pf2是什麽意思呢?毫無實際意義。

兩指針變量進行關係運算:指向同一數組的兩指針變量進行關係運算可表示它們所指數組元素之間的關係。

例如:

pf1==pf2表示pf1和pf2指向同一數組元素;

pf1>pf2表示pf1處於高地址位置;

pf1<pf2表示pf2處於低地址位置。

指針變量還可以與0比較。

p為指針變量,則p==0表明p是空指針,它不指向任何變量;

p!=0表示p不是空指針。

空指針是由對指針變量賦予0值而得到的。

例如:

#define NULL 0

int *p=NULL;

對指針變量賦0值和不賦值是不同的。指針變量未賦值時,可以是任意值,是不能使用的。否則將造成意外錯誤。而指針變量賦0值後,則可以使用,隻是它不指向具體的變量而已。

【例10.7】

main(){

  int a=10,b=20,s,t,*pa,*pb; /*說明pa,pb為整型指針變量*/

  pa=&a;                     /*給指針變量pa賦值,pa指向變量a*/

  pb=&b;                     /*給指針變量pb賦值,pb指向變量b*/

  s=*pa+*pb;                 /*求a+b之和,(*pa就是a,*pb就是b)*/

  t=*pa**pb;                 /*本行是求a*b之積*/

  printf("a=%d\nb=%d\na+b=%d\na*b=%d\n",a,b,a+b,a*b);

  printf("s=%d\nt=%d\n",s,t);

}

【例10.8】

main(){

  int a,b,c,*pmax,*pmin;             /*pmax,pmin為整型指針變量*/

  printf("input three numbers:\n");  /*輸入提示*/

  scanf("%d%d%d",&a,&b,&c);         /*輸入三個數字*/

  if(a>b){                          /*如果第一個數字大於第二個數字...*/

    pmax=&a;                        /*指針變量賦值*/

    pmin=&b;}                       /*指針變量賦值*/

  else{

    pmax=&b;                        /*指針變量賦值*/

    pmin=&a;}                       /*指針變量賦值*/

  if(c>*pmax) pmax=&c;              /*判斷並賦值*/

  if(c<*pmin) pmin=&c;              /*判斷並賦值*/

    printf("max=%d\nmin=%d\n",*pmax,*pmin); /*輸出結果*/

}

西安做網站

指針變量幾個問題的進一步說明——西安做網站-www.xgktgj.com