C++中指針的數(shù)據(jù)類型和運(yùn)算相關(guān)知識(shí)小結(jié)
C++有關(guān)指針的數(shù)據(jù)類型和指針運(yùn)算的小結(jié)
前面已用過(guò)一些指針運(yùn)算(如p++,p+i等),現(xiàn)在把全部的指針運(yùn)算列出如下。
1) 指針變量加/減 一個(gè)整數(shù)
例如:p++,p--,p+i,p-i,p+-i,p-=i等。
C++規(guī)定,一個(gè)指針變量加/減一個(gè)整數(shù)是將該指針變量的原值(是一個(gè)地址)和它指向的變量所占用的內(nèi)存單元字節(jié)數(shù)相加或相減。如p+i代表這樣的地址計(jì)算:p+i*d,d為p所指向的變量單元所占用的字節(jié)數(shù)。這樣才能保證p+i指向p下面的第i個(gè)元素。
2) 指針變量賦值
將一個(gè)變量地址賦給一個(gè)指針變量。如:
p=&a; //將變量a的地址賦給p p=array; //將數(shù)組array首元素的地址賦給p p=&array[i]; //將數(shù)組array第i個(gè)元素的地址賦給p p=max; //max為已定義的函數(shù),將max的入口地址賦給p p1=p2; //p1和p2都是同類型的指針變量,將p2的值賦給p1
3) 指針變量可以有空值,即該指針變量不指向任何變量,可以這樣表示:
p=NULL;
實(shí)際上NULL代表整數(shù)0,也就是使p指向地址為0的單元。這樣可以使指針不指向任何有效的單元。實(shí)際上系統(tǒng)已先定義了NULL:
#define NULL 0
在iostream頭文件中就包括了以上的NULL定義,NULL是一個(gè)符號(hào)常量。應(yīng)注意,p的值等于NULL和p未被賦值是兩個(gè)不同的概念。
任何指針變量或地址都可以與NULL作相等或不相等的比較,如:
if(p==NULL) p=p1;
4) 兩個(gè)指針變量可以相減
如果兩個(gè)指針變量指向同一個(gè)數(shù)組的元素,則兩個(gè)指針變量值之差是兩個(gè)指針之間的元素個(gè)數(shù),見(jiàn)圖6.25。
假如p1指向a[1],p2指向a[4],則p2-p1=(a+4)-(a+1)=4-1=3,但p1+p2并無(wú)實(shí)際意義。
5) 兩個(gè)指針變量比較
若兩個(gè)指針指向同一個(gè)數(shù)組的元素,則可以進(jìn)行比較。指向前面的元素的指針變量小于指向后面元素的指針變量。如圖6.25中,p1<p2,或者說(shuō),表達(dá)式“p1<p2”的值為真,而“p2<p1”的值為假。注意,如果p1和p2不指向同一數(shù)組則比較無(wú)意義。
6) 對(duì)指針變量的賦值應(yīng)注意類型問(wèn)題
在本章前幾節(jié)中介紹了指針的基本概念和初步應(yīng)用。應(yīng)該說(shuō)明,指針是C和C++中重要的概念,是C和C++的一個(gè)特色。使用指針的優(yōu)點(diǎn)是:
提高程序效率;
在調(diào)用函數(shù)時(shí),如果改變被調(diào)用函數(shù)中某些變量的值,這些值能為主調(diào)函數(shù)使用,即可以通過(guò)函數(shù)的調(diào)用,得到多個(gè)可改變的值;
可以實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ)分配。
但是同時(shí)應(yīng)該看到,指針使用實(shí)在太靈活,對(duì)熟練的程序人員來(lái)說(shuō),可以利用它編寫出頗有特色的、質(zhì)量?jī)?yōu)良的程序,實(shí)現(xiàn)許多用其他高級(jí)語(yǔ)言難以實(shí)現(xiàn)的功能,但也十分容易出錯(cuò),而且這種錯(cuò)誤往往難以發(fā)現(xiàn)。
C++指針數(shù)組和指向指針的指針
指針數(shù)組的概念
如果一個(gè)數(shù)組,其元素均為指針類型數(shù)據(jù),該數(shù)組稱為指針數(shù)組,也就是說(shuō),指針數(shù)組中的每一個(gè)元素相當(dāng)于一個(gè)指針變量,它的值都是地址。一維指針數(shù)組的定義形式為:
類型名 *數(shù)組名[數(shù)組長(zhǎng)度];
例如:
int *p[4];
可以用指針數(shù)組中各個(gè)元素分別指向若干個(gè)字符串,使字符串處理更加方便靈活。
【例】若干字符串按字母順序(由小到大)輸出。
#include <iostream> using namespace std; int main( ) { void sort(char *name[],int n); //聲明函數(shù) void print(char *name[],int n); //聲明函數(shù) char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"}; //定義指針數(shù)組 int n=5; sort(name,n); print(name,n); return 0; } void sort(char *name[],int n) { char *temp; int i,j,k; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0) k=j; if(k!=i) { temp=name[i];name[i]=name[k];name[k]=temp; } } } void print(char *name[],int n) { int i; for(i=0;i<n;i++) cout<<name[i]<<endl; }
運(yùn)行結(jié)果為:
BASIC COBOL C++ FORTRAN Pascal
print函數(shù)的作用是輸出各字符串。name[0]~name[4]分別是各字符串的首地址。print函數(shù)也可改寫為以下形式:
void print(char *name[],int n) { int i=0 char *p; p=name[0]; while(i<n) { p=*(name+i++); cout<<p<<endl; } }
其中“*(name+i++)”表示先求*(name+i)的值,即name[i](它是一個(gè)地址)。將它賦給p,然后i加1。最后輸出以p地址開始的字符串。
指向指針的指針
在掌握了指針數(shù)組的概念的基礎(chǔ)上,下面介紹指向指針數(shù)據(jù)的指針,簡(jiǎn)稱為指向指針的指針。從圖6.22可以看到,name是一個(gè)指針數(shù)組,它的每一個(gè)元素是一個(gè)指針型數(shù)據(jù)(其值為地址),分別指向不同的字符串。數(shù)組名name代表該指針數(shù)組首元素的地址。name+i是name[i]的地址。由于name[i]的值是地址(即指針),因此name+i就是指向指針型數(shù)據(jù)的指針。還可以設(shè)置一個(gè)指針變量p,它指向指針數(shù)組的元素(見(jiàn)圖)。p就是指向指針型數(shù)據(jù)的指針變量。
怎樣定義一個(gè)指向指針數(shù)據(jù)的指針變量呢?如下:
char *(*p);
從附錄B可以知道,*運(yùn)算符的結(jié)合性是從右到左,因此“char *(*p);”可寫成:
char **p;
【例】指向字符型數(shù)據(jù)的指針變量。
#include <iostream> using namespace std; int main( ) { char **p; //定義指向字符指針數(shù)據(jù)的指針變量p char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"}; p=name+2; //見(jiàn)圖6.23中p的指向 cout<<*p<<endl; //輸出name[2]指向的字符串 cout<<**p<<endl; //輸出name[2]指向的字符串中的第一個(gè)字符 }
運(yùn)行結(jié)果為:
C++ C
指針數(shù)組的元素也可以不指向字符串,而指向整型數(shù)據(jù)或單精度型數(shù)據(jù)等。
在本章開頭已經(jīng)提到了“間接訪問(wèn)”一個(gè)變量的方式。利用指針變量訪問(wèn)另一個(gè)變量就是“間接訪問(wèn)”。如果在一個(gè)指針變量中存放一個(gè)目標(biāo)變量的地址,這就是“單級(jí)間址”,見(jiàn)圖6.24(a)。指向指針的指針用的是“二級(jí)間址”方法。見(jiàn)下圖。從理論上說(shuō),間址方法可以延伸到更多的級(jí),見(jiàn)下圖。但實(shí)際上在程序中很少有超過(guò)二級(jí)間址的。
上一篇:簡(jiǎn)單舉例說(shuō)明C++中break和continue語(yǔ)句的用法
欄 目:C語(yǔ)言
下一篇:詳解C++編程中對(duì)于函數(shù)的基本使用
本文標(biāo)題:C++中指針的數(shù)據(jù)類型和運(yùn)算相關(guān)知識(shí)小結(jié)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2738.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文