# 4.C語言指針變量的運算
指針變量可以進行某些運算,但其運算的種類是有限的。它只能進行賦值運算和部分算術運算及關系運算。
## 指針運算符
指針運算符有兩種:
* 取地址運算符(&):取地址運算符(&)是單目運算符,其結合性為自右至左,其功能是取變量的地址。在scanf函數及前面介紹指針變量賦值中,我們已經了解并使用了&運算符。
* 取內容運算符(*):取內容運算符(*)是單目運算符,其結合性為自右至左,用來表示指針變量所指的變量。在*運算符之后跟的變量必須是指針變量。
需要注意的是指針運算符(*)和指針變量說明中的指針說明符(*)不是一回事。在指針變量說明中,“*”是類型說明符,表示其后的變量是指針類型。而表達式中出現的“*”則是一個運算符用以表示指針變量所指的變量。
【例10-6】
~~~
main(){
int a=5,*p=&a;
printf ("%d",*p);
}
~~~
表示指針變量p取得了整型變量a的地址。printf("%d",*p)語句表示輸出變量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]*/
~~~
指針變量的加減運算只能對數組指針變量進行,對指向其它類型變量的指針變量作加減運算是毫無意義的。
## 兩個指針變量之間的運算
只有指向同一數組的兩個指針變量之間才能進行運算,否則運算毫無意義。
1) 兩指針變量相減
兩指針變量相減所得之差是兩個指針所指數組元素之間相差的元素個數。實際上是兩個指針值(地址)相減之差再除以該數組元素的長度(字節數)。例如pf1和pf2是指向同一浮點數組的兩個指針變量,設pf1的值為2010H,pf2的值為2000H,而浮點數組每個元素占4個字節,所以pf1-pf2的結果為(2000H-2010H)/4=4,表示pf1和 pf2之間相差4個元素。兩個指針變量不能進行加法運算。例如,pf1+pf2是什么意思呢?毫無實際意義。
2) 兩指針變量進行關系運算
指向同一數組的兩指針變量進行關系運算可表示它們所指數組元素之間的關系。例如:
* 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); /*輸出結果*/
}
~~~
- 前言
- 一. C語言概述
- 1.C語言的發展及其版本
- 2.C語言工作原理和運行機制
- 3.C語言編譯器(開發工具|IDE)推薦
- 4.C語言的特點
- 5.第一個C語言程序
- 6.C語言輸出函數(printf)和輸入函數(scanf)
- 7.C語言程序的結構特點
- 8.C語言字符集
- 9.C語言詞匯
- 二. C語言算法
- 1.什么是算法|算法的概念
- 2.簡單的C語言算法舉例
- 3.C語言算法的特性
- 4.用流程圖表示算法
- 5.三種基本結構的流程圖
- 6.用N-S流程圖表示算法
- 7.用計算機語言表示算法
- 三. 數據類型和運算符
- 1.C語言的數據類型
- 2.C語言常量與變量
- 3.C語言整型數據
- 4.C語言實型數據
- 5.C語言字符型數據
- 6.C語言變量賦初值
- 7.C語言數據類型轉換
- 8.C語言算術運算符和算術表達式
- 9.C語言賦值運算符和賦值表達式
- 10.C語言逗號運算符和逗號表達式
- 四. 順序程序設計
- 1.C語言語句概述
- 2.C語言賦值語句詳解
- 3.C語言數據的輸入輸出
- 4.C語言字符的輸入輸出
- 7.C語言順序結構程序設計舉例
- 五. 分支結構
- 1.C語言關系運算符和表達式
- 2.C語言邏輯運算符和表達式
- 3.C語言if語句詳解
- 4.C語言switch語句的用法詳解
- 5.C語言條件運算符和條件表達式
- 6.C語言分支結構程序舉例
- 六. 循環控制
- 1.C語言循環控制概述
- 2.C語言goto語句以及用goto語句構成循環
- 3.C語言while語句的用法
- 4.C語言do-while語句的用法
- 5.C語言for語句用法詳解
- 6.C語言幾種循環的比較
- 7.C語言break和continue語句的用法
- 8.C語言循環控制程序舉例
- 七. C語言數組
- 1.C語言一維數組的定義和引用
- 2.C語言二維數組的定義和引用
- 3.C語言字符數組及其應用
- 4.C語言常用字符串處理函數
- 5.C語言數組應用舉例
- 6.C語言數組小結
- 八. C語言函數
- 1.C語言函數概述
- 2.C語言函數的定義
- 3.C語言函數的參數和返回值
- 4.C語言函數的調用
- 5.C語言函數的嵌套調用
- 6.C語言函數的遞歸調用
- 7.C語言數組作為函數參數
- 8.C語言局部變量和全局變量
- 9.C語言變量的存儲類別
- 九. 預處理命令
- 1.C語言預處理概述
- 2.C語言無參數宏定義
- 3.C語言帶參數宏定義
- 4.C語言文件包含命令
- 5.C語言條件編譯詳解
- 6.C語言預處理指令總結
- 十. C語言指針
- 1.C語言指針的概念
- 2.C語言指針變量
- 3.C語言指針變量作為函數參數
- 4.C語言指針變量的運算
- 5.C語言數組指針
- 6.C語言通過指針引用數組
- 7.C語言數組名作函數參數
- 8.C語言指向多維數組的指針
- 9.C語言字符串指針
- 10.C語言字符串指針變量與字符數組的區別
- 11.C語言函數指針變量
- 12.C語言指針型函數
- 13.C語言指針數組的概念
- 14.C語言指向指針的指針
- 15.C語言main函數參數
- 16.關于指針的總結
- 十一. 結構體和共用體
- 1.C語言結構體的定義
- 2.C語言結構類型變量的說明
- 3.C語言結構變量成員的表示方法
- 4.C語言結構變量的賦值
- 5.C語言結構變量的初始化
- 6.C語言結構體數組的定義
- 7.C語言指向結構體變量的指針
- 8.C語言指向結構體數組的指針
- 9.C語言結構體指針變量作函數參數
- 10.C語言動態存儲分配
- 11.C語言鏈表的概念
- 12.C語言枚舉類型
- 13.C語言類型定義符typedef
- 十二. 位運算
- 1.C語言位運算符詳解
- 2.C語言位域(位段)
- 3.關于位運算的總結
- 十三. 文件操作
- 1.C語言文件概述
- 2.C語言文件指針
- 3.C語言文件的打開與關閉
- 4.C語言文件的讀寫
- 5.C語言文件的隨機讀寫
- 6.C語言文件檢測函數
- 7.C語言庫文件(頭文件)有哪些
- 8.文件操作小結