C語言_指標變數的賦值與運算,很詳細

OldBoy~發表於2017-12-28

指標變數的賦值

指標變數同普通變數一樣,使用之前不僅要定義說明, 而且必須賦予具體的值。未經賦值的指標變數不能使用, 否則將造成系統混亂,甚至當機。指標變數的賦值只能賦予地址, 決不能賦予任何其它資料,否則將引起錯誤。在C語言中, 變數的地址是由編譯系統分配的,對使用者完全透明,使用者不知道變數的具體地址。 C語言中提供了地址運算子&來表示變數的地址。其一般形式為: & 變數名; 如&a變示變數a的地址,&b表示變數b的地址。 變數本身必須預先說明。設有指向整型變數的指標變數p,如要把整型變數a 的地址賦予p可以有以下兩種方式:

(1)指標變數初始化的方法 int a;
int *p=&a;
(2)賦值語句的方法 int a;
int *p;
p=&a;

不允許把一個數賦予指標變數,故下面的賦值是錯誤的: int *p;p=1000; 被賦值的指標變數前不能再加“*”說明符,如寫為*p=&a 也是錯誤的。

指標變數的運算

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

指標運算子

1.取地址運算子& 取地址運算子&是單目運算子,其結合性為自右至左,其功能是取變數的地址。

2.取內容運算子* 取內容運算子*是單目運算子,其結合性為自右至左,用來表示指標變數所指的變數。在*運算子之後跟的變數必須是指標變數。需要注意的是指標運算子*和指標變數說明中的指標說明符* 不是一回事。在指標變數說明中,“*”是型別說明符,表示其後的變數是指標型別。而表示式中出現的“*”則是一個運算子用以表示指標變數所指的變數。

main(){
int a=5,*p=&a;
printf ("%d",*p);
}
......//表示指標變數p取得了整型變數a的地址。本語句表示輸出變數a的值。

賦值運算

指標變數的賦值運算有以下幾種形式:

1:指標變數初始化賦值。

2:把一個變數的地址賦予指向相同資料型別的指標變數。例如:

int a,*pa;
pa=&a; /*把整型變數a的地址賦予整型指標變數pa*/

3、把一個指標變數的值賦予指向相同型別變數的另一個指標變數。如:

int a,*pa=&a,*pb;
pb=pa; /*把a的地址賦予指標變數pb*/
由於pa,pb均為指向整型變數的指標變數,因此可以相互賦值。

4、把陣列的首地址賦予指向陣列的指標變數。

例如: int a[5],*pa;
pa=a; (陣列名錶示陣列的首地址,故可賦予指向陣列的指標變數pa)
也可寫為:
pa=&a[0]; /*陣列第一個元素的地址也是整個陣列的首地址,
也可賦予pa*/
當然也可採取初始化賦值的方法:
int a[5],*pa=a;

5、把字串的首地址賦予指向字元型別的指標變數。例如: char *pc;pc="c language";或用初始化賦值的方法寫為: char *pc="C Language"; 這裡應說明的是並不是把整個字串裝入指標變數, 而是把存放該字串的字元陣列的首地址裝入指標變數。 在後面還將詳細介紹。

6、把函式的入口地址賦予指向函式的指標變數。例如: 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]*/ 

指標變數的加減運算只能對陣列指標變數進行, 對指向其它型別變數的指標變數作加減運算是毫無意義的。(3)兩個指標變數之間的運算只有指向同一陣列的兩個指標變數之間才能進行運算, 否則運算毫無意義。

①兩指標變數相減

兩指標變數相減所得之差是兩個指標所指陣列元素之間相差的元素個數。實際上是兩個指標值(地址) 相減之差再除以該陣列元素的長度(位元組數)。例如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處於低地址位置
main(){
int a=10,b=20,s,t,*pa,*pb; 
pa=&a;
pb=&b;
s=*pa+*pb;
t=*pa**pb;
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);
}

...... 說明pa,pb為整型指標變數

給指標變數pa賦值,pa指向變數a。

給指標變數pb賦值,pb指向變數b。

本行的意義是求a+b之和,(*pa就是a,*pb就是b)。

本行是求a*b之積。

輸出結果。

輸出結果。

......

指標變數還可以與0比較。設p為指標變數,則p==0表明p是空指標,它不指向任何變數;p!=0表示p不是空指標。空指標是由對指標變數賦予0值而得到的。例如: #define NULL 0 int *p=NULL; 對指標變數賦0值和不賦值是不同的。指標變數未賦值時,可以是任意值,是不能使用的。否則將造成意外錯誤。而指標變數賦0值後,則可以使用,只是它不指向具體的變數而已。

複製程式碼
main(){
int a,b,c,*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);
}
複製程式碼

上面程式碼的意思是:

pmax,pmin為整型指標變數。

輸入提示。

輸入三個數字。

如果第一個數字大於第二個數字...

指標變數賦值

指標變數賦值

指標變數賦值

指標變數賦值

判斷並賦值

判斷並賦值

輸出結果

......

相關文章