久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      指針數(shù)組

      前面介紹了指向不同類型變量的指針的定義和使用,我們可以讓指針指向某類變量,并替代該變量在程序中使用;我們也可以讓指針指向一維、二維數(shù)組或字符數(shù)組,來替代這些數(shù)組在程序中使用,給我們在編程時帶來許多方便。
      下面我們定義一種特殊的數(shù)組,這類數(shù)組存放的全部是指針,分別用于指向某類的變量,以替代這些變量在程序中的使用,增加靈活性。指針數(shù)組定義形式:
      類型標(biāo)識*數(shù)組名[數(shù)組長度]
      例如: char *str[4];
      由于[ ] 比*優(yōu)先權(quán)高,所以首先是數(shù)組形式str[4 ],然后才是與“*”的結(jié)合。這樣一來指針數(shù)組包含4個指針s t r [ 0 ]、s t r [ 1 ]、s t r [ 2 ]、s t r [ 3 ],各自指向字符類型的變量。例如: int *
      p t r [ 5 ] ;
      該指針數(shù)組包含5個指針p t r [ 0 ]、p t r [ 1 ]、p t r [ 2 ]、p t r [ 3 ]、p t r [ 4 ],各自指向整型類型的變量。
      [例6-22] 針對指針數(shù)組的應(yīng)用,我們分別用指針數(shù)組的各指針指向字符串?dāng)?shù)組、指向一維整型數(shù)組、指向二維整型數(shù)組。
      #include <stdlib.h>
      #include <stdio.h>
      m a i n ( )
      {
      char *ptr1[4]={“china”,”chengdu”,”sichuang”,”chongqin”};
      /* 指針數(shù)組p t r 1 的4個指針分別依此指向4個字符串* /
      int i,*ptr2[3],a[3]={1,2,3},b[3][2]={1,2,3,4,5,6};
      for(i=0;i<4;i++)
      printf(“n%s”,ptr1[i]);/依*此輸出ptr1數(shù)組4個指針指向的4個字符串*/
      printf(“n”);
      for(i=0;i<3;i++)
      ptr2[i]=&a[i];/*將整型一維數(shù)組a的3個元素的地址傳遞給指針數(shù)組ptr2*/
      for(i=0;i<3;i++)/*依此輸出ptr2所指向的3個整型變量的值*/
      printf(“%4d”,*ptr2[i]);
      printf(“n”);
      for(i=0;i<3;i++)
      ptr2[i]=b[i];/*傳遞二維數(shù)組b的每行首地址給指針數(shù)組的4個指針*/
      for(i=0;i<3;i++)/*按行輸出*/
      printf(“%4d%4dn”,*ptr2[i],*ptr2[i]+1);
      }
      程序中指針數(shù)組與所指對象的關(guān)系如圖6-12所示。
      指針數(shù)組
      ptr1指針數(shù)組中的4個指針分別指向4個字符串,如圖6-11的a)所示,程序中依此輸出;ptr2指針數(shù)組共有3個指針,若將整型一維數(shù)組a中各元素地址分別傳遞給指針數(shù)組的各指針,則ptr2[0]就指向a[0];ptr2[1]就指向a[1];ptr2[2]就指向a[2]。若將二維數(shù)組各行的首地址分別傳遞給指針數(shù)組的各指針,如圖6-11b)所示,這樣一來,ptr2[0]就指向了b數(shù)組的第0行,該行有兩個元素,其地址為ptr2[0]與ptr2[0]+1;相應(yīng)指針數(shù)組第i個元素ptr2[i]指向的b數(shù)組的第i行兩個元素地址分別為ptr2[i]與ptr[i]+1。
      指針數(shù)組
      在處理二維字符數(shù)組時,我們可以把二維字符數(shù)組看成是由多個一維字符數(shù)組構(gòu)成,也就是說看成是多個字符串構(gòu)成的二維字符數(shù)組,或稱為字符串?dāng)?shù)組。
      指針數(shù)組對于解決這類問題(當(dāng)然也可以解決其它問題)提供了更加靈活方便的操作。
      有一點(diǎn)需要說明,若定義一個指針數(shù)組后,指針數(shù)組各元素的取值(即地址)要注意安全性。
      如定義指針數(shù)組:
      char*ptr[3];
      我們說該數(shù)組包含三個指針,但指針的指向是不確定的,指針現(xiàn)在可能指向內(nèi)存的任一地址。假定現(xiàn)在作語句:scanf(“%s”,ptr[i]),則輸入的字符串在內(nèi)存的存放其地址由ptr[i]決定。除非給指針數(shù)組元素賦值安全的地址。
      [例6-23]定義字符指針數(shù)組,包含5個數(shù)組元素。同時再定義一個二維字符數(shù)組其數(shù)組大小為5*10,即5行10列,可存放5個字符串。若將各字符串的首地址傳遞給指針數(shù)組各元素,那么指針數(shù)組就成為名副其實(shí)的字符串?dāng)?shù)組。下面對各字符串進(jìn)行按字典排序。
      在字符串的處理函數(shù)中,strcmp(str1,str2)函數(shù)就可以對兩個字符串進(jìn)行比較,函數(shù)的返回值>0、=0、<0分別表示串str1大于str2、str1等于str2、str1小于str2。再利用strcpy()函數(shù)實(shí)現(xiàn)兩個串的復(fù)制。下面選用冒泡排序法。
      #include<stdlib.h>
      #include<string.h>
      #include<stdio.h>
      main()
      {
      char*ptr1[4],str[4][20],temp[20];
      /*定義指針數(shù)組、二維字符數(shù)組、用于交換的一維字符數(shù)組*/
      inti,j;
      for(i=0;i<4;i++)
      gets(str[i]);/*輸入4個字符串*/
      printf(“n”);
      for(i=0;i<4;i++)
      ptr1[i]=str[i];/*將二維字符數(shù)組各行的首地址傳遞給指針數(shù)組的各指針*/
      printf(“original string:n”);
      for(i=0;i<4;i++)/*按行輸出原始各字符串*/
      printf(“%sn”,ptr1[i]);
      printf(“ordinal string:n”);
      for(i=0;i<3;i++)/*冒泡排序*/
      for(j=0;j<4-i-1;j++)
      if(strcmp(ptr1[j],ptr1[j+1])>0)
      {strcpy(temp,ptr1[j]);
      strcpy(ptr1[j],ptr1[j+1]);
      strcpy(ptr1[j+1],temp);
      }
      for(i=0;i<4;i++)/*輸出排序后的字符串*/
      printf(“%sn”,ptr1[i]);
      }
      指針數(shù)組
      程序中一定要注意指針的正確使用。一旦將二維字符數(shù)組的各行首地址傳遞給指針數(shù)組
      的各指針,則相當(dāng)于給指針分配了安全可操作的地址,地址空間大小由二維字符數(shù)組來決定。
      當(dāng)然也可由編譯系統(tǒng)為指針分配地址用于字符串的存放。
      [例6-24]利用malloc()函數(shù)為指針分配存儲空間,實(shí)現(xiàn)字符串的排序。
      #include<stdlib.h>
      #include<string.h>
      #include<stdio.h>
      main()
      {
      char *ptr1[4],*temp;
      inti,j;
      for(i=0;i<4;i++)
      {
      ptr1[i]=malloc(20);/*為指針數(shù)組各指針分配20字節(jié)的存儲空間*/
      gets(ptr1[i]);
      }
      printf(“n”);
      printf(“original string:n”);
      for(i=0;i<4;i++)
      printf(“%sn”,ptr1[i]);
      printf(“ordinal string:n”);
      for(i=0;i<3;i++)
      for(j=0;j<4-i-1;j++)
      if(strcmp(ptr1[j],ptr1[j+1])>0)
      {
      temp=ptr1[j];/*利用指向字符串的指針,進(jìn)行指針地址的交換*/
      ptr1[j]=ptr1[j+1];
      ptr1[j+1]=temp;
      }
      for(i=0;i<4;i++)/*字符串輸出*/
      printf(“%sn”,ptr1[i]);
      }
      運(yùn)行程序,其結(jié)果與上述例6-23完全相同。

      [例6-25]對已排好序的字符指針數(shù)組進(jìn)行指定字符串的查找。字符串按字典順序排列,查找算法采用二分法,或稱為折半查找。
      折半查找算法描述:
      1.設(shè)按開序(或降序)輸入n個字符串到一個指針數(shù)組。
      2.設(shè)low指向指針數(shù)組的低端,high指向指針數(shù)組的高端,mid=(low+high)/2
      3.測試mid所指的字符串,是否為要找的字符串。
      4.若按字典順序,mid所指的字符串大于要查找的串,表示被查字符串在low和mid之間,
      否則,表示被查字符串在mid和high之間。
      5.修改low式high的值,重新計算mid,繼續(xù)尋找。
      #include<stdlib.h>
      #include<alloc.h>
      #include<string.h>
      #include<stdio.h>
      main()
      {
      char*binary();/*函數(shù)聲明*/
      char*ptr1[5],*temp;
      inti,j;
      for(i=0;i<5;i++)
      {
      ptr1[i]=malloc(20);/*按字典順序輸入字符串*/
      gets(ptr1[i]);
      }
      printf(“n”);
      printf(“original string:n”);
      for(i=0;i<5;i++)
      printf(“%sn”,ptr1[i]);
      printf(“input search string:n”);
      temp=malloc(20);
      gets(temp);/輸*入被查找字符串*/
      i=5;
      temp=binary(ptr1,temp,i);/*調(diào)用查找函數(shù)*/
      if(temp)printf(“succesful—–%sn”,temp);
      elseprintf(“nosuccesful!n”);
      return;
      }
      char *binary(char *ptr[],char *str,int定n)義返回字符指針的函數(shù)*/
      {/*折半查找*/
      inthig,low,mid;
      low=0;
      hig=n-1;
      while(low<=hig)
      {
      mid=(low+hig)/2;
      if(strcmp(str,ptr[mid])<0)
      hig=mid-1;
      elseif(strcmp(str,ptr[mid])>0)
      low=mid+1;
      else return(str);/*查帳成功,返回被查字符串*/
      }
      return NULL; / *查找失敗,返回空指針* /
      }
      指針數(shù)組
      [例6-26] 在一個已排好序的字符串?dāng)?shù)組中,插入一個鍵盤輸入的字符串,使其繼續(xù)保持有序。
      在上述程序查找成功的基礎(chǔ)上,我們將該字符串插入到字符數(shù)組中。插入的位置可以是數(shù)組頭、中間或數(shù)組尾。查找的算法采用折半算法,找到插入位置后,將字符串插入。
      #include <stdlib.h>
      #include <alloc.h>
      #include <string.h>
      #include <stdio.h>
      m a i n ( )
      {
      int binary(); / *查找函數(shù)聲明* /
      void insert(); / *插入函數(shù)聲明* /
      char *temp,*ptr1[6];
      int i,j;
      for (i=0;i<5;i++)
      {

      ptr1[i]=malloc(20);/*為指針分配地址后*/
      gets(ptr1[i]);/*輸入字符串*/
      }
      ptr1[5]=malloc(20);
      printf(“n”);
      printf(“original string:n”);
      for(i=0;i<5;i++)/*輸出指針數(shù)組各字符串*/
      printf(“%sn”,ptr1[i]);
      printf(“input search string:n”);
      temp=malloc(20);
      gets(temp);/*輸入被插字符串*/
      i=binary(ptr1,temp,5)/*;尋找插入位置i*/
      printf(“i=%dn”,i);
      insert(ptr1,temp,5,i);/*在插入位置i處插入字符串*/
      printf(“outputstrings:n”);
      for(i=0;i<6;i++)/*輸出指針數(shù)組的全部字符串*/
      printf(“%sn”,ptr1[i]);
      return;
      }
      intbinary(char*ptr[],char*str,intn)
      {/*折半查找插入位置*/
      int hig,low,mid;
      low=0;
      hig=n-1;
      if(strcmp(str,ptr[0])<0)return0;
      /*若插入字符串比字符串?dāng)?shù)組的第0個小,則插入位置為0*/
      if(strcmp(str,ptr[hig])>0)returnn;
      /*若插入字符串比字符串?dāng)?shù)組的最后一個大,則應(yīng)插入字符串?dāng)?shù)組的尾部*/
      while(low<=hig)
      {
      mid=(low+hig)/2;
      if(strcmp(str,ptr[mid])<0)
      hig=mid-1;
      else if(strcmp(str,ptr[mid])>0)
      low=mid+1;
      else return(mid);/*插入字符串與字符串?dāng)?shù)組的某個字符串相同*/
      }
      returnlow;/*插入的位置在字符串?dāng)?shù)組中間*/
      }
      void insert(char*ptr[],char*str,intn,inti)
      {
      int j;
      for(j=n;j>i;j–)/*將插入位置之后的字符串后移*/
      strcpy(ptr[j],ptr[j-1]);
      strcpy(ptr[i],str);將被插字符串按字典順序插入字符串?dāng)?shù)組*/
      }
      在程序中,字符串?dāng)?shù)組的6個指針均分配存放20字節(jié)的有效地址。語句ptr1[5]=malloc(20)保證插入字符串后,也具有安全的存儲空間,字符串的長度以串中最長的為基準(zhǔn)向系統(tǒng)申請存儲空間,以保證在串的移動中有足夠的存儲空間。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號