亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中字符串以及數(shù)組和指針的互相使用講解

 更新時間:2015年09月14日 17:07:31   投稿:goldensun  
這篇文章主要介紹了C++中字符串以及數(shù)組和指針的互相使用講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

C++字符串與指針
在C++中可以用3種方法訪問一個字符串(在第5章介紹了前兩種方法)。
用字符數(shù)組存放一個字符串

【例】定義一個字符數(shù)組并初始化,然后輸出其中的字符串。

#include <iostream>
using namespace std;
int main( )
{
  char str[]="I love CHINA!";
  cout<<str<<endl;
  return 0;
}


運(yùn)行時輸出:

I love CHINA!


用字符串變量存放字符串

【例】定義一個字符串變量并初始化,然后輸出其中的字符串。

#include <string>
#include <iostream>
using namespace std;
int main( )
{
  string str="I love CHINA!";
  cout<<str<<endl;
  return 0;
}

用字符指針指向一個字符串

【例】定義一個字符指針變量并初始化,然后輸出它指向的字符串。

#include <iostream>
using namespace std;
int main( )
{
  char *str="I love CHINA!";
  cout<<str<<endl;
  return 0;
}

對字符串中字符的存取,可以用下標(biāo)方法,也可以用指針方法。

【例】將字符串str1復(fù)制為字符串str2。

定義兩個字符數(shù)組str1和str2,再設(shè)兩個指針變量p1和p2,分別指向兩個字符數(shù)組中的有關(guān)字符,通過改變指針變量的值使它們指向字符串中的不同的字符,以實(shí)現(xiàn)字符的復(fù)制。

#include <iostream>
using namespace std;
int main( )
{
  char str1[]="I love CHINA!",str2[20],*p1,*p2;
  p1=str1;p2=str2;
  for(;*p1!='\\0';p1++,p2++)
    *p2=*p1;
  *p2='\\0';
  p1=str1;p2=str2;
  cout<<"str1 is: "<<p1<<endl;
  cout<<"str2 is: "<<p2<<endl;
  return 0;
}

運(yùn)行結(jié)果為:

str1 is: I love CHINA!
str2 is: I love CHINA!


這個例子用來說明怎樣使用字符指針。其實(shí),對例6.13來說,用string變量來處理是十分簡單的:

  string str1=″I love CHINA!″,str2; //定義string變量
  str2=str1; //將str1復(fù)制到str2

C++數(shù)組與指針
指向數(shù)組元素的指針

一個變量有地址,一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素(把某一元素的地址放到一個指針變量中)。所謂數(shù)組元素的指針就是數(shù)組元素的地址。

  int a[10];  //定義一個整型數(shù)組a,它有10個元素
  int *p; //定義一個基類型為整型的指針變量p
  p=&a[0]; //將元素a[0]的地址賦給指針變量p,使p指向a[0]

在C++中,數(shù)組名代表數(shù)組中第一個元素(即序號為0的元素)的地址。因此,下面兩個語句等價:

  p=&a[0];
  p=a;

在定義指針變量時可以給它賦初值:

  int *p=&a[0]; //p的初值為a[0]的地址


也可以寫成

  int *p=a; //作用與前一行相同


可以通過指針引用數(shù)組元素。假設(shè)p已定義為一個基類型為整型的指針變量,并已將一個整型數(shù)組元素的地址賦給了它,使它指向某一個數(shù)組元素。如果有以下賦值語句:

  *p=1; //對p當(dāng)前所指向的數(shù)組元素賦予數(shù)值1


如果指針變量p已指向數(shù)組中的一個元素,則p+1指向同一數(shù)組中的下一個元素。

如果p的初值為&a[0],則:
1) p+i和a+i就是a[i]的地址,或者說,它們指向a數(shù)組的第i個元素,見圖6.12。

2) *(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素,即a[i]。

可以看出,[]實(shí)際上是變址運(yùn)算符。對a[i]的求解過程是: 先按a+i×d計算數(shù)組元素的地址,然后找出此地址所指向的單元中的值。

3) 指向數(shù)組元素的指針變量也可以帶下標(biāo),如p[i]與*(p+i)等價。

根據(jù)以上敘述,引用一個數(shù)組元素,可用以下方法:
下標(biāo)法,如a[i]形式;
指針法,如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組元素的指針變量。如果已使p的值為a,則*(p+i)就是a[i]??梢酝ㄟ^指向數(shù)組元素的指針找到所需的元素。使用指針法能使目標(biāo)程序質(zhì)量高。

【例】輸出數(shù)組中的全部元素。假設(shè)有一個整型數(shù)組a,有10個元素。要輸出各元素的值有3種方法:

1) 下標(biāo)法。

#include <iostream>
using namespace std;
int main( )
{
  int a[10];
  int i;
  for(i=0;i<10;i++)
  cin>>a[i]; //引用數(shù)組元素a[i]
  cout<<endl;
  for(i=0;i<10;i++)
   cout<<a[i]<<" "; //引用數(shù)組元素a[i]
  cout<<endl;
  return 0;
}

運(yùn)行情況如下:

9 8 7 6 5 4 3 2 1 0↙      (輸入10個元素的值)
9 8 7 6 5 4 3 2 1 0       (輸出10個元素的值)

2) 指針法。
將上面程序第7行和第10行的“a[i]”改為“*(a+i)”,運(yùn)行情況與(1)相同。

3) 用指針變量指向數(shù)組元素。

#include <iostream>
using namespace std;
int main( )
{
  int a[10];
  int i,*p=a; //指針變量p指向數(shù)組a的首元素a[0]
  for(i=0;i<10;i++)
    cin>>*(p+i); //輸入a[0]~a[9]共10個元素
  cout<<endl;
  for(p=a;p<(a+10);p++)
    cout<<*p<<" "; //p先后指向a[0]~a[9]
  cout<<endl;
  return 0;
}

運(yùn)行情況與前相同。請仔細(xì)分析p值的變化和*p的值。

對3種方法的比較:
方法(1)和(2)的執(zhí)行效率是相同的。第(3)種方法比方法(1)、(2)快。這種方法能提高執(zhí)行效率。

用下標(biāo)法比較直觀,能直接知道是第幾個元素。用地址法或指針變量的方法都不太直觀,難以很快地判斷出當(dāng)前處理的是哪一個元素。在用指針變量指向數(shù)組元素時要注意: 指針變量p可以指向有效的數(shù)組元素,實(shí)際上也可以指向數(shù)組以后的內(nèi)存單元。如果有

  int a[10], *p=a;  //指針變量p的初值為&a[0]
  cout<<*(p+10);  //要輸出a[10]的值


在使用指針變量指向數(shù)組元素時,應(yīng)切實(shí)保證指向數(shù)組中有效的元素。

指向數(shù)組元素的指針的運(yùn)算比較靈活,務(wù)必小心謹(jǐn)慎。下面舉幾個例子。

如果先使p指向數(shù)組a的首元素(即p=a),則:
1) p++(或p+=1)。使p指向下一元素,即a[1]。如果用*p,得到下一個元素a[1]的值。

2) *p++。由于++和*同優(yōu)先級,結(jié)合方向?yàn)樽杂叶?,因此它等價于*(p++)。作用是: 先得到p指向的變量的值(即*p),然后再使p的值加1。例6.5(3)程序中最后一個for語句:

  for(p=a;p<a+10;p++)
  cout<<*p;


可以改寫為

  for(p=a;p<a+10;)
  cout<<*p++;

3) *(p++)與*(++p)作用不同。前者是先取*p值,然后使p加1。后者是先使p加1,再取*p。若p的初值為a(即&a[0]),輸出*(p++)得到a[0]的值,而輸出*(++p)則得到a[1]的值。

4) (*p)++表示p所指向的元素值加1,即(a[0])++,如果a[0]=3,則(a[0])++的值為4。注意: 是元素值加1,而不是指針值加1。

5) 如果p當(dāng)前指向a[i],則
    *(p--)    先對p進(jìn)行“*”運(yùn)算,得到a[i],再使p減1,p指向a[i-1]。
    *(++p)   先使p自加1,再作*運(yùn)算,得到a[i+1]。
    *(--p)   先使p自減1,再作*運(yùn)算,得到a[i-1]。
將++和--運(yùn)算符用于指向數(shù)組元素的指針變量十分有效,可以使指針變量自動向前或向后移動,指向下一個或上一個數(shù)組元素。例如,想輸出a數(shù)組100個元素,可以用以下語句:
   

  p=a;
  while(p<a+100)
  cout<<*p++;



  p=a;
  while(p<a+100)
  {
    cout<<*p;
    p++;
  }


在用*p++形式的運(yùn)算時,很容易弄錯,一定要十分小心,弄清楚先取p值還是先使p加1。
用指針變量作函數(shù)參數(shù)接收數(shù)組地址

在前面介紹過可以用數(shù)組名作函數(shù)的參數(shù)。前面已經(jīng)多次強(qiáng)調(diào): 數(shù)組名代表數(shù)組首元素的地址。用數(shù)組名作函數(shù)的參數(shù),傳遞的是數(shù)組首元素的地址。很容易推想: 用指針變量作函數(shù)形參,同樣可以接收從實(shí)參傳遞來的數(shù)組首元素的地址(此時,實(shí)參是數(shù)組名)。下面用指針變量作函數(shù)形參。

【例】將10個整數(shù)按由小到大的順序排列。在例5.7程序的基礎(chǔ)上,將形參改為指針變量。

#include <iostream>
using namespace std;
int main( )
{
  void select_sort(int *p,int n); //函數(shù)聲明
  int a[10],i;
  cout<<"enter the originl array:"<<endl;
  for(i=0;i<10;i++) //輸入10個數(shù)
    cin>>a[i];
  cout<<endl;
  select_sort(a,10); //函數(shù)調(diào)用,數(shù)組名作實(shí)參
  cout<<"the sorted array:"<<endl;
  for(i=0;i<10;i++) //輸出10個已排好序的數(shù)
    cout<<a[i]<<" ";
  cout<<endl;
  return 0;
}
void select_sort(int *p,int n) //用指針變量作形參
{
  int i,j,k,t;
  for(i=0;i<n-1;i++)
  {
    k=i;
    for(j=i+1;j<n;j++)         
      if(*(p+j)<*(p+k)) k=j; //用指針法訪問數(shù)組元素
    t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;
  }
}

運(yùn)行情況

C++編譯系統(tǒng)將形參數(shù)組名一律作為指針變量來處理。

實(shí)際上在函數(shù)調(diào)用時并不存在一個占有存儲空間的形參數(shù)組,只有指針變量。

實(shí)參與形參的結(jié)合,有以下4種形式:
實(shí)  參                 形  參
數(shù)組名              數(shù)組名       

數(shù)組名            指針變量     

指針變量          數(shù)組名
指針變量        指針變量

在此基礎(chǔ)上,還要說明一個問題: 實(shí)參數(shù)組名a代表一個固定的地址,或者說是指針型常量,因此要改變a的值是不可能的。如:
 

  a++; //語法錯誤,a是常量,不能改變

而形參數(shù)組名是指針變量,并不是一個固定的地址值。它的值是可以改變的。在函數(shù)調(diào)用開始時,它接收了實(shí)參數(shù)組首元素的地址,但在函數(shù)執(zhí)行期間,它可以再被賦值。如:

f(array[], int n)
{
  cout<<array; //輸出array[0]的值
  array=array+3; //指針變量array的值改變了,指向array[3]
  cout<<*arr<<endl; //輸出array[3]的值
}

多維數(shù)組與指針

用指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素。

1) 多維數(shù)組元素的地址
設(shè)有一個二維數(shù)組a,它有3行4列。它的定義為:

  int a[3][4]={{1,3,5,7},{9,11,13,15},{17,18,21,23}};


a是一個數(shù)組名。a數(shù)組包含3行,即3個元素:a[0],a[1],a[2]。而每一元素又是一個一維數(shù)組,它包含4圖6.14個元素(即4個列元素),例如,a[0]所代表的一維數(shù)組又包含4個元素: a[0][0], a[0][1], a[0][2], a[0][3]。可以認(rèn)為二維數(shù)組是“數(shù)組的數(shù)組”,即數(shù)組a是由3個一維數(shù)組所組成的。

從二維數(shù)組的角度來看,a代表二維數(shù)組首元素的地址,現(xiàn)在的首元素不是一個整型變量,而是由4個整型元素所組成的一維數(shù)組,因此a代表的是首行的起始地址(即第0行的起始地址,&a[0]),a+1代表a[1]行的首地址,即&a[1]。

a[0],a[1],a[2]既然是一維數(shù)組名,而C++又規(guī)定了數(shù)組名代表數(shù)組首元素地址,因此a[0]代表一維數(shù)組a[0]中0列元素的地址,即&a[0][0]。a[1]的值是&a[1][0],a[2]的值是&a[2][0]。


0行1列元素的地址可以直接寫為&a[0][1],也可以用指針法表示。a[0]為一維數(shù)組名,該一維數(shù)組中序號為1的元素顯然可以用a[0]+1來表示。

欲得到a[0][1]的值,用地址法怎么表示呢?既然a[0]+1是a[0][1]元素的地址,那么,*(a[0]+1) 就是a[0][1]元素的值。而a[0]又是和*(a+0)無條件等價的,因此也可以用*(*(a+0)+1)表示a[0][1]元素的值。依此類推,*(a[i]+j)或*(*(a+i)+j)是a[i][j]的值。

2) 指向多維數(shù)組元素的指針變量

① 指向數(shù)組元素的指針變量
【例】輸出二維數(shù)組各元素的值。這里采用的方法是用基類型為整型的指針變量先后指向各元素,逐個輸出它們的值。

#include <iostream>
using namespace std;
int main( )
{
  int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
  int *p;               //p是基類型為整型的指針變量
  for(p=a[0];p<a[0]+12;p++)
    cout<<*p<<" ";
  cout<<endl;
  return 0;
}

運(yùn)行結(jié)果如下:

1 3 5 7 9 11 13 15 17 19 21 23

關(guān)于指向數(shù)組元素的指針變量的幾點(diǎn)說明:
p是指向整型數(shù)據(jù)的指針變量,在for語句中對p賦初值a[0],也可以寫成“p=&a[0][0]”。
循環(huán)結(jié)束的條件是“p<a[0]+12”,只要滿足p<a[0]+12,就繼續(xù)執(zhí)行循環(huán)體。
執(zhí)行“cout<<*p;”輸出p當(dāng)前所指的列元素的值,然后執(zhí)行p++,使p指向下一個列元素。

②指向由m個元素組成的一維數(shù)組的指針變量
可以定義一個指針變量,它不是指向一個整型元素,而是指向一個包含m個元素的一維數(shù)組。這時,如果指針變量p先指向a[0](即p=&a[0]),則p+1不是指向a[0][1],而是指向a[1],p的增值以一維數(shù)組的長度為單位,見圖6.17。

【例】輸出二維數(shù)組任一行任一列元素的值。

#include <iostream>
using namespace std;
int main( )
{
  int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
  int (*p)[4],i,j;
  cin>>i>>j;
  p=a;
  cout<<*(*(p+i)+j)<<endl;
  return 0;
}

運(yùn)行情況如下:

2 3↙
23

由于執(zhí)行了“p=a”,使p指向a[0]。因此p+2是二維數(shù)組a中序號為2的行的起始地址(由于p是指向一維數(shù)組的指針變量,因此p加1,就指向下一個一維數(shù)組)。*(p+2)+3是a數(shù)組2行3列元素地址。*(*(p+2)+3)是a[2][3]的值。

3) 用指向數(shù)組的指針作函數(shù)參數(shù)
一維數(shù)組名可以作為函數(shù)參數(shù)傳遞,多維數(shù)組名也可作函數(shù)參數(shù)傳遞。

【例】輸出二維數(shù)組各元素的值。題目與例6.7相同,但本題用一個函數(shù)實(shí)現(xiàn)輸出,用多維數(shù)組名作函數(shù)參數(shù)。

#include <iostream>
using namespace std;
int main( )
{
  void output(int (*p)[4]); //函數(shù)聲明 
  int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
  output(a); //多維數(shù)組名作函數(shù)參數(shù)
  return 0;
}
void output(int (*p)[4]) //形參是指向一維數(shù)組的指針變量
{
  int i,j;
  for(i=0;i<3;i++)
    for(j=0;j<4;j++)
      cout<<*(*(p+i)+j)<<" ";
  cout<<endl;
}

運(yùn)行情況如下:

1 3 5 7 9 11 13 15 17 19 21 23

相關(guān)文章

  • C++樹之遍歷二叉樹實(shí)例詳解

    C++樹之遍歷二叉樹實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于C++樹之遍歷二叉樹的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 使用C++實(shí)現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換

    使用C++實(shí)現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了如何使用C++實(shí)現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-06-06
  • C語言中遞歸和排列組合詳解

    C語言中遞歸和排列組合詳解

    大家好,本篇文章主要講的是C語言中遞歸和排列組合詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++超詳細(xì)講解智能指針

    C++超詳細(xì)講解智能指針

    為了解決內(nèi)存泄漏的問題,C++中提出了智能指針。內(nèi)存泄漏的產(chǎn)生原因有很多,即使我們正確的使用malloc和free關(guān)鍵字也有可能產(chǎn)生內(nèi)存泄漏,如在malloc和free之間如果存在拋異常,那也會產(chǎn)生內(nèi)存泄漏。這種問題被稱為異常安全
    2022-06-06
  • 使用C++制作簡單的web服務(wù)器

    使用C++制作簡單的web服務(wù)器

    本文給大家分享的是使用C++簡單實(shí)現(xiàn)web服務(wù)器的代碼,雖然非常的簡陋,功能也很少,主要是為了更好的理解WEB服務(wù)器的工作原理,推薦給大家,也希望對大家能夠有所幫助。
    2015-03-03
  • 使用c語言判斷100以內(nèi)素數(shù)的示例(c語言求素數(shù))

    使用c語言判斷100以內(nèi)素數(shù)的示例(c語言求素數(shù))

    這篇文章主要介紹了使用c語言判斷100以內(nèi)素數(shù)的示例(c語言求素數(shù)),需要的朋友可以參考下
    2014-03-03
  • C++深入淺出探索數(shù)據(jù)結(jié)構(gòu)的原理

    C++深入淺出探索數(shù)據(jù)結(jié)構(gòu)的原理

    C++的數(shù)據(jù)結(jié)構(gòu)很多,很復(fù)雜,所以本文將通過示例帶大家深入了解一下C++中的數(shù)據(jù)結(jié)構(gòu)與算法。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-05-05
  • 遞歸法求最大公約數(shù)和最小公倍數(shù)的實(shí)現(xiàn)代碼

    遞歸法求最大公約數(shù)和最小公倍數(shù)的實(shí)現(xiàn)代碼

    今天整理了一下用遞歸法求最大公約數(shù)(gcd)和最小公倍數(shù)(lcm)。主要的工作是求最大公約數(shù)。數(shù)學(xué)上可以用輾轉(zhuǎn)法求最大公約數(shù)
    2013-05-05
  • C++ 中私有繼承的作用

    C++ 中私有繼承的作用

    這篇文章主要介紹了C++ 中私有繼承的作用的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • C語言仿QQ聊天界面抖動功能

    C語言仿QQ聊天界面抖動功能

    這篇文章主要為大家詳細(xì)介紹了C語言仿QQ聊天界面抖動功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論