程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中指針的數據類型和運算相干常識小結

C++中指針的數據類型和運算相干常識小結

編輯:關於C++

C++中指針的數據類型和運算相干常識小結。本站提示廣大學習愛好者:(C++中指針的數據類型和運算相干常識小結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中指針的數據類型和運算相干常識小結正文


C++有關指針的數據類型和指針運算的小結
後面已用過一些指針運算(如p++,p+i等),如今把全體的指針運算列出以下。

1) 指針變量加/減 一個整數
例如:p++,p--,p+i,p-i,p+-i,p-=i等。

C++劃定,一個指針變量加/減一個整數是將該指針變量的原值(是一個地址)和它指向的變量所占用的內存單位字節數相加或相減。如p+i代表如許的地址盤算:p+i*d,d為p所指向的變量單位所占用的字節數。如許能力包管p+i指向p上面的第i個元素。

2) 指針變量賦值
將一個變量地址賦給一個指針變量。如:

 p=&a; //將變量a的地址賦給p
 p=array; //將數組array首元素的地址賦給p
 p=&array[i]; //將數組array第i個元素的地址賦給p
 p=max; //max為已界說的函數,將max的進口地址賦給p
 p1=p2; //p1和p2都是同類型的指針變量,將p2的值賦給p1

3) 指針變量可以有空值,即該指針變量不指向任何變量,可以如許表現:

 p=NULL;


現實上NULL代表整數0,也就是使p指向地址為0的單位。如許可使指針不指向任何有用的單位。現實上體系已先界說了NULL:

 #define NULL 0


在iostream頭文件中就包含了以上的NULL界說,NULL是一個符號常量。應留意,p的值等於NULL和p未被賦值是兩個分歧的概念。

任何指針變量或地址都可以與NULL作相等或不相等的比擬,如:

 if(p==NULL) p=p1;

4) 兩個指針變量可以相減
假如兩個指針變量指向統一個數組的元素,則兩個指針變量值之差是兩個指針之間的元素個數,見圖6.25。

假設p1指向a[1],p2指向a[4],則p2-p1=(a+4)-(a+1)=4-1=3,但p1+p2並沒有現實意義。

5) 兩個指針變量比擬
若兩個指針指向統一個數組的元素,則可以停止比擬。指向後面的元素的指針變量小於指向前面元素的指針變量。如圖6.25中,p1<p2,或許說,表達式“p1<p2”的值為真,而“p2<p1”的值為假。留意,假如p1和p2不指向統一數組則比擬有意義。


6) 對指針變量的賦值應留意類型成績
在本章前幾節中引見了指針的根本概念和初步運用。應當解釋,指針是C和C++中主要的概念,是C和C++的一個特點。應用指針的長處是:
進步法式效力;
在挪用函數時,假如轉變被挪用函數中某些變量的值,這些值能為主調函數應用,便可以經由過程函數的挪用,獲得多個可轉變的值;
可以完成靜態存儲分派。

然則同時應當看到,指針應用其實太靈巧,對闇練的法式人員來講,可以應用它編寫出很有特點的、質量優秀的法式,完成很多用其他高等說話難以完成的功效,但也非常輕易失足,並且這類毛病常常難以發明。

C++指針數組和指向指針的指針
指針數組的概念

假如一個數組,其元素均為指針類型數據,該數組稱為指針數組,也就是說,指針數組中的每個元素相當於一個指針變量,它的值都是地址。一維指針數組的界說情勢為:
    類型名 *數組名[數組長度];
例如:

 int *p[4];


可以用指針數組中各個元素分離指向若干個字符串,使字符串處置加倍便利靈巧。

【例】若干字符串按字母次序(由小到年夜)輸入。

#include <iostream>
using namespace std;
int main( )
{
 void sort(char *name[],int n); //聲明函數
 void print(char *name[],int n); //聲明函數
 char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"}; //界說指針數組
 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;
}

運轉成果為:

BASIC
COBOL
C++
FORTRAN
Pascal


print函數的感化是輸入各字符串。name[0]~name[4]分離是各字符串的首地址。print函數也可改寫為以下情勢:

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](它是一個地址)。將它賦給p,然後i加1。最初輸入以p地址開端的字符串。
指向指針的指針

在控制了指針數組的概念的基本上,上面引見指向指針數據的指針,簡稱為指向指針的指針。從圖6.22可以看到,name是一個指針數組,它的每個元素是一個指針型數據(其值為地址),分離指向分歧的字符串。數組名name代表該指針數組首元素的地址。name+i是name[i]的地址。因為name[i]的值是地址(即指針),是以name+i就是指向指針型數據的指針。還可以設置一個指針變量p,它指向指針數組的元素(見圖)。p就是指向指針型數據的指針變量。

如何界說一個指向指針數據的指針變量呢?以下:

 char *(*p);


從附錄B可以曉得,*運算符的聯合性是從右到左,是以“char *(*p);”可寫成:

 char **p;

【例】指向字符型數據的指針變量。

#include <iostream>
using namespace std;
int main( )
{
 char **p; //界說指向字符指針數據的指針變量p
 char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"};
 p=name+2; //見圖6.23中p的指向
 cout<<*p<<endl; //輸入name[2]指向的字符串
 cout<<**p<<endl; //輸入name[2]指向的字符串中的第一個字符
}

運轉成果為:

C++
C


指針數組的元素也能夠不指向字符串,而指向整型數據或單精度型數據等。

在本章開首曾經提到了“直接拜訪”一個變量的方法。應用指針變量拜訪另外一個變量就是“直接拜訪”。假如在一個指針變量中寄存一個目的變量的地址,這就是“單級間址”,見圖6.24(a)。指向指針的指針用的是“二級間址”辦法。見下圖。從實際上說,間址辦法可以延長到更多的級,見下圖。但現實上在法式中很少有跨越二級間址的。



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