亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

指針數組

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

[例6-25]對已排好序的字符指針數組進行指定字符串的查找。字符串按字典順序排列,查找算法采用二分法,或稱為折半查找。
折半查找算法描述:
1.設按開序(或降序)輸入n個字符串到一個指針數組。
2.設low指向指針數組的低端,high指向指針數組的高端,mid=(low+high)/2
3.測試mid所指的字符串,是否為要找的字符串。
4.若按字典順序,mid所指的字符串大于要查找的串,表示被查字符串在low和mid之間,
否則,表示被查字符串在mid和high之間。
5.修改low式high的值,重新計算mid,繼續尋找。
#include<stdlib.h>
#include<alloc.h>
#include<string.h>
#include<stdio.h>
main()
{
char*binary();/*函數聲明*/
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("%s/n",ptr1[i]);
printf("input search string:/n");
temp=malloc(20);
gets(temp);/輸*入被查找字符串*/
i=5;
temp=binary(ptr1,temp,i);/*調用查找函數*/
if(temp)printf("sUCcesful-----%s/n",temp);
elseprintf("nosuccesful!/n");
return;
}
char *binary(char *ptr[],char *str,int定n)義返回字符指針的函數*/
{/*折半查找*/
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; / *查找失敗,返回空指針* /
}
指針數組(圖四)
[例6-26] 在一個已排好序的字符串數組中,插入一個鍵盤輸入的字符串,使其繼續保持有序。
在上述程序查找成功的基礎上,我們將該字符串插入到字符數組中。插入的位置可以是數組頭、中間或數組尾。查找的算法采用折半算法,找到插入位置后,將字符串插入。
#include <stdlib.h>
#include <alloc.h>
#include <string.h>
#include <stdio.h>
m a i n ( )
{
int binary(); / *查找函數聲明* /
void insert(); / *插入函數聲明* /
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++)/*輸出指針數組各字符串*/
printf("%s/n",ptr1[i]);
printf("input search string:/n");
temp=malloc(20);
gets(temp);/*輸入被插字符串*/
i=binary(ptr1,temp,5)/*;尋找插入位置i*/
printf("i=%d/n",i);
insert(ptr1,temp,5,i);/*在插入位置i處插入字符串*/
printf("outputstrings:/n");
for(i=0;i<6;i++)/*輸出指針數組的全部字符串*/
printf("%s/n",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;
/*若插入字符串比字符串數組的第0個小,則插入位置為0*/
if(strcmp(str,ptr[hig])>0)returnn;
/*若插入字符串比字符串數組的最后一個大,則應插入字符串數組的尾部*/
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);/*插入字符串與字符串數組的某個字符串相同*/
}
returnlow;/*插入的位置在字符串數組中間*/
}
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);將被插字符串按字典順序插入字符串數組*/
}
在程序中,字符串數組的6個指針均分配存放20字節的有效地址。語句ptr1[5]=malloc(20)保證插入字符串后,也具有安全的存儲空間,字符串的長度以串中最長的為基準向系統申請存儲空間,以保證在串的移動中有足夠的存儲空間。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩黄在线观看| 欧美有码在线观看| 91九色国产社区在线观看| 亚洲网在线观看| 欧美日韩国产综合视频在线观看中文| 欧美性猛交xxxx乱大交蜜桃| 日本韩国在线不卡| 欧美一区二区三区四区在线| 亚洲国产成人精品久久| 欧美高跟鞋交xxxxxhd| 黑人巨大精品欧美一区二区| 日韩欧美视频一区二区三区| 久久国产精品视频| 成人高清视频观看www| 亚洲欧洲在线看| 久久精品国产亚洲| 久久99精品国产99久久6尤物| 在线视频国产日韩| 久久噜噜噜精品国产亚洲综合| 91国内精品久久| 亚洲图片在区色| 久久影视免费观看| 欧日韩不卡在线视频| 色在人av网站天堂精品| 青青在线视频一区二区三区| 国内成人精品视频| 亚洲自拍偷拍一区| 中文字幕久热精品在线视频| 久久久女女女女999久久| 国产视频久久久久| 成人a在线视频| 国产免费亚洲高清| 在线观看国产成人av片| 亚洲视频777| 亚洲最大av网站| 91精品综合视频| 日韩中文字幕精品| 91理论片午午论夜理片久久| 欧美激情二区三区| 成人午夜两性视频| 国产在线一区二区三区| 亚洲成人激情视频| 国产精品流白浆视频| 久久人人爽人人爽人人片av高请| 欧美激情第99页| 少妇高潮久久77777| 欧美日韩国产一区二区三区| 国内精品小视频在线观看| 97视频在线观看网址| 98午夜经典影视| 国产日本欧美一区二区三区在线| 国产亚洲综合久久| 91精品国产高清自在线看超| 国产精品jizz在线观看麻豆| 日本精品久久中文字幕佐佐木| 国产又爽又黄的激情精品视频| 欧美黄色片视频| 中文字幕九色91在线| 国产精品福利在线| 亚洲国产日韩欧美在线动漫| 国产精品国产三级国产专播精品人| 久久视频免费在线播放| 岛国精品视频在线播放| 欧美激情国产日韩精品一区18| 欧美在线视频免费观看| 日韩精品极品视频免费观看| 日韩精品中文字幕有码专区| 97免费在线视频| 国产精品爽黄69天堂a| 日韩av电影院| 国产亚洲aⅴaaaaaa毛片| 疯狂做受xxxx高潮欧美日本| 亚洲影视九九影院在线观看| 中文字幕国内精品| 欧美日韩在线一区| 国产精品啪视频| 992tv成人免费影院| 日本国产一区二区三区| 91超碰caoporn97人人| 日韩成人高清在线| 国产精品视频导航| 自拍偷拍亚洲区| 国产精品免费久久久久影院| 福利精品视频在线| 日韩专区在线观看| 国产精品一区二区三区免费视频| 欧美一区三区三区高中清蜜桃| 亚洲2020天天堂在线观看| 国产精品精品视频一区二区三区| 欧美性猛交xxxx久久久| 亚洲欧美中文日韩在线v日本| 久久伊人精品天天| 最新91在线视频| 欧美成在线观看| 欧美日韩国产中字| 92国产精品久久久久首页| 88国产精品欧美一区二区三区| 欧美日韩爱爱视频| 97在线视频免费| 韩国19禁主播vip福利视频| 欧美一级黄色网| 成人免费视频在线观看超级碰| 日韩av男人的天堂| 中文字幕在线看视频国产欧美| 亚洲人免费视频| 在线成人激情视频| 日韩中文字幕欧美| 日韩国产欧美精品一区二区三区| 亚洲成色777777女色窝| 欧美国产视频一区二区| 国产精品久久77777| 91九色综合久久| 久久久精品电影| 91麻豆国产语对白在线观看| 国产美女高潮久久白浆| 亚洲aaaaaa| 日韩av不卡在线| 国产精品一二三在线| 国产精品mp4| 欧美成年人网站| 欧美成人免费全部观看天天性色| 亚洲国产天堂久久综合网| 成人网址在线观看| 日韩最新免费不卡| 日韩精品视频观看| 精品国产成人在线| 精品少妇一区二区30p| 日韩在线播放视频| 日韩三级影视基地| 91sao在线观看国产| 亚洲第一男人天堂| 日韩成人在线视频| 亚洲精品不卡在线| 久久久久久18| 久久久久久999| 草民午夜欧美限制a级福利片| 在线电影欧美日韩一区二区私密| 亚洲精品永久免费| 亚洲美女精品成人在线视频| 美女福利精品视频| 日韩欧美一区二区在线| 亚洲视频电影图片偷拍一区| 98视频在线噜噜噜国产| 国产91精品最新在线播放| 日韩黄色高清视频| 欧美丝袜一区二区三区| 国产精品成人久久久久| 欧美激情视频网站| 成人做爰www免费看视频网站| 国产欧美日韩专区发布| 日韩在线观看免费高清完整版| 精品一区二区三区四区| 久久亚洲综合国产精品99麻豆精品福利| 国产精品av网站| 亚洲视频国产视频| 98精品国产高清在线xxxx天堂| 国产精品福利小视频| 国产精欧美一区二区三区| 97在线看免费观看视频在线观看| 欧美日韩亚洲高清| 亚洲欧美激情在线视频| 久久免费视频网站| 91精品国产99久久久久久| 欧洲美女7788成人免费视频|