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

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

C語言入門之多維數組的指針變量

2019-11-17 05:23:57
字體:
來源:轉載
供稿:網友

  一、多維數組地址的表示方法

   設有整型二維數組a[3][4]如下:

   0 1 2 3
   4 5 6 7
   8 9 10 11

   設數組a的首地址為1000,各下標變量的首地址及其值如圖所示。

在前面曾經介紹過, C語言答應把一個二維數組分解為多個一維數組來處理。因此數組a可分解為三個一維數組,即a[0],a[1],a[2]。每一個一維數組又含有四個元素。例如a[0]數組,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。 數組及數組元素的地址表示如下:a是二維數組名,也是二維數組0行的首地址,等于1000。a[0]是第一個一維數組的數組名和首地址,因此也為1000。*(a+0)或*a是與a[0]等效的, 它表示一維數組a[0]0 號元素的首地址。 也為1000。&a[0][0]是二維數組a的0行0列元素首地址,同樣是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。同理,a+1是二維數組1行的首地址,等于1008。a[1]是第二個一維數組的數組名和首地址,因此也為1008。 &a[1][0]是二維數組a的1行0列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。 由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。 此外,&a[i]和a[i]也是等同的。因為在二維數組中不能把&a[i]理解為元素a[i]的地址,不存在元素a[i]。

   C語言規定,它是一種地址計算方法,表示數組a第i行首地址。由此,我們得出:a[i],&a[i],*(a+i)和a+i也都是等同的。另外,a[0]也可以看成是a[0]+0是一維數組a[0]的0號元素的首地址, 而a[0]+1則是a[0]的1號元素首地址,由此可得出a[i]+j則是一維數組a[i]的j號元素首地址,它等于&a[i][j]。由a[i]=*(a+i)得a[i]+j=*(a+i)+j,由于*(a+i)+j是二維數組a的i行j列元素的首地址。該元素的值等于*(*(a+i)+j)。

[EXPlain]

#define PF "%d,%d,%d,%d,%d,/n"
main(){
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
PRintf(PF,a,*a,a[0],&a[0],&a[0][0]);
printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
printf("%d,%d/n",a[1]+1,*(a+1)+1);
printf("%d,%d/n",*(a[1]+1),*(*(a+1)+1));
}

   二、多維數組的指針變量

   把二維數組a 分解為一維數組a[0],a[1],a[2]之后,設p為指向二維數組的指針變量。可定義為: int (*p)[4] 它表示p是一個指針變量,它指向二維數組a 或指向第一個一維數組a[0],其值等于a,a[0],或&a[0][0]等。而p+i則指向一維數組a[i]。從前面的分析可得出*(p+i)+j是二維數組i行j 列的元素的地址,而*(*(p+i)+j)則是i行j列元素的值。

   二維數組指針變量說明的一般形式為: 類型說明符 (*指針變量名)[長度] 其中“類型說明符”為所指數組的數據類型。“*”表示其后的變量是指針類型。 “長度”表示二維數組分解為多個一維數組時, 一維數組的長度,也就是二維數組的列數。應注重“(*指針變量名)”兩邊的括號不可少,如缺少括號則表示是指針數組(本章后面介紹),意義就完全不同了。

[Explain]

main(){
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
int i,j;
p=a;
for(i=0;i<3;i++)
for(j=0;j<4;j++) printf("%2d ",*(*(p+i)+j));
}

   'Expain字符串指針變量的說明和使用字符串指針變量的定義說明與指向字符變量的指針變量說明是相同的。只能按對指針變量的賦值不同來區別。 對指向字符變量的指針變量應賦予該字符變量的地址。如: char c,*p=&c;表示p是一個指向字符變量c的指針變量。而: char *s="C Language";則表示s是一個指向字符串的指針變量。把字符串的首地址賦予s。

   請看下面一例。

main(){
char *ps;
ps="C Language";
printf("%s",ps);
}

   運行結果為:

   C Language

   上例中,首先定義ps是一個字符指針變量, 然后把字符串的首地址賦予ps(應寫出整個字符串,以便編譯系統把該串裝入連續的一塊內存單元),并把首地址送入ps。程序中的: char *ps;ps="C Language";等效于: char *ps="C Language";輸出字符串中n個字符后的所有字符。

main(){
char *ps="this is a book";
int n=10;
ps=ps+n;
printf("%s/n",ps);
}

   運行結果為:

   book 在程序中對ps初始化時,即把字符串首地址賦予ps,當ps= ps+10之后,ps指向字符“b”,因此輸出為"book"。

main(){
char st[20],*ps;
int i;
printf("input a string:/n");
ps=st;
scanf("%s",ps);
for(i=0;ps[i]!='/0';i++)
if(ps[i]=='k'){
printf("there is a 'k' in the string/n");
break;
}
if(ps[i]=='/0') printf("There is no 'k' in the string/n");
}

   本例是在輸入的字符串中查找有無‘k'字符。 下面這個例子是將指針變量指向一個格式字符串,用在printf函數中,用于輸出二維數組的各種地址表示的值。但在printf語句中用指針變量PF代替了格式串。 這也是程序中常用的方法。

main(){
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
char *PF;
PF="%d,%d,%d,%d,%d/n";
printf(PF,a,*a,a[0],&a[0],&a[0][0]);
printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
printf("%d,%d/n",a[1]+1,*(a+1)+1);
printf("%d,%d/n",*(a[1]+1),*(*(a+1)+1));
}

   在下例是講解,把字符串指針作為函數參數的使用。要求把一個字符串的內容復制到另一個字符串中,并且不能使用strcpy函數。函數cprstr的形參為兩個字符指針變量。pss指向源字符串,pds指向目標字符串。表達式:

(*pds=*pss)!=`/0'
cpystr(char *pss,char *pds){
while((*pds=*pss)!='/0'){
pds++;
pss++; }
}
main(){
char *pa="CHINA",b[10],*pb;
pb=b;
cpystr(pa,pb);
printf("string a=%s/nstring b=%s/n",pa,pb);
}

   在上例中,程序完成了兩項工作:一是把pss指向的源字符復制到pds所指向的目標字符中,二是判定所復制的字符是否為`/0',若是則表明源字符串結束,不再循環。否則,pds和pss都加1,指向下一字符。在主函數中,以指針變量pa,pb為實參,分別取得確定值后調用cprstr函數。由于采用的指針變量pa和pss,pb和pds均指向同一字符串,因此在主函數和cprstr函數中均可使用這些字符串。也可以把cprstr函數簡化為以下形式:

cprstr(char *pss,char*pds)
{while ((*pds++=*pss++)!=`/0');}

   即把指針的移動和賦值合并在一個語句中。 進一步分析還可發現`/0'的ASCⅡ碼為0,對于while語句只看表達式的值為非0就循環,為0則結束循環,因此也可省去“!=`/0'”這一判定部分,而寫為以下形式:

cprstr (char *pss,char *pds)
{while (*pdss++=*pss++);}

   表達式的意義可解釋為,源字符向目標字符賦值, 移動指針,若所賦值為非0則循環,否則結束循環。這樣使程序更加簡潔。簡化后的程序如下所示。

cpystr(char *pss,char *pds){
while(*pds++=*pss++);
}
main(){
char *pa="CHINA",b[10],*pb;
pb=b;
cpystr(pa,pb);
printf("string a=%s/nstring b=%s/n",pa,pb);
}

   使用字符串指針變量與字符數組的區別

   用字符數組和字符指針變量都可實現字符串的存儲和運算。 但是兩者是有區別的。在使用時應注重以下幾個問題:

   1. 字符串指針變量本身是一個變量,用于存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續的內存空間中并以‘/0'作為串的結束。字符數組是由于若干個數組元素組成的,它可用來存放整個字符串。

   2. 對字符數組作初始化賦值,必須采用外部類型或靜態類型,如: static char st[]={“C Language”};而對字符串指針變量則無此限制,如: char *ps="C Language";

   3. 對字符串指針方式 char *ps="C Language";可以寫為: char *ps; ps="C Language";而對數組方式:

static char st[]={"C Language"};

   不能寫為:

char st[20];st={"C Language"};

   而只能對字符數組的各元素逐個賦值。

   從以上幾點可以看出字符串指針變量與字符數組在使用時的區別,同時也可看出使用指針變量更加方便。前面說過,當一個指針變量在未取得確定地址前使用是危險的,輕易引起錯誤。但是對指針變量直接賦值是可以的。因為C系統對指針變量賦值時要給以確定的地址。因此,

char *ps="C Langage";

   或者

char *ps;
ps="C Language";

   都是合法的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精国产精品| 伊人伊人伊人久久| 国产精品成人va在线观看| 91久久精品美女| 最近的2019中文字幕免费一页| 欧美日韩国产在线播放| 有码中文亚洲精品| 国产精品美女呻吟| 亚洲综合中文字幕68页| 日韩视频在线一区| 在线亚洲国产精品网| 国产亚洲精品一区二555| 都市激情亚洲色图| 欧美成aaa人片在线观看蜜臀| 欧美乱大交做爰xxxⅹ性3| 日韩欧美高清视频| 亚洲国产精品va| 亚洲国产精品福利| 欧美日韩在线观看视频| 亚洲人成网站777色婷婷| 亚洲成人激情在线| 欧美在线观看网址综合| 日韩av在线免费看| 国产精品美乳在线观看| 国产精品国产福利国产秒拍| 亚洲一区二区三区在线免费观看| 国产精品白丝av嫩草影院| 亚洲欧洲日产国产网站| 免费99精品国产自在在线| 国产69精品久久久久久| 欧美日韩视频在线| 欧美日韩美女在线| 91久久在线视频| 久久久久免费精品国产| 欧美大胆a视频| 亚洲精品欧美日韩| 日韩少妇与小伙激情| 韩剧1988在线观看免费完整版| 亚洲激情视频在线播放| 97国产精品视频人人做人人爱| 欧美亚洲另类制服自拍| 欧美精品做受xxx性少妇| 国产欧美日韩精品丝袜高跟鞋| 亚洲午夜色婷婷在线| 成人免费淫片aa视频免费| 91精品国产亚洲| 91免费版网站入口| 亚洲另类图片色| 亚洲激情成人网| 日韩av手机在线观看| 国产精品久久久久久久久久ktv| 91在线免费网站| 成人信息集中地欧美| 精品人伦一区二区三区蜜桃网站| 黑人巨大精品欧美一区二区三区| 97不卡在线视频| 国产成人精品久久二区二区| 国产成人精品最新| 91在线观看免费高清完整版在线观看| 亚洲成年网站在线观看| 人人爽久久涩噜噜噜网站| 精品国产户外野外| www.日本久久久久com.| 久久精品国产99国产精品澳门| 在线播放日韩专区| 欧美在线视频免费观看| 国产精品成人v| 欧美成人精品在线| 午夜免费日韩视频| 欧美最顶级丰满的aⅴ艳星| 亚洲xxxxx| 人人爽久久涩噜噜噜网站| 久久免费高清视频| 国产精品都在这里| 免费91在线视频| 欧美日韩国产综合新一区| 中文字幕亚洲一区二区三区| 欧美黑人一级爽快片淫片高清| 色偷偷888欧美精品久久久| 亚洲午夜久久久影院| 国产精品一区久久久| 亚洲视频日韩精品| 性色av一区二区三区在线观看| 有码中文亚洲精品| 久久男人的天堂| 日本精品一区二区三区在线播放视频| 欧美一级免费看| 国产v综合v亚洲欧美久久| 国产成人一区三区| 91久久精品久久国产性色也91| 欧美xxxx做受欧美| 97免费在线视频| 在线播放精品一区二区三区| 97精品一区二区视频在线观看| 最近2019中文字幕第三页视频| 色妞在线综合亚洲欧美| 疯狂做受xxxx欧美肥白少妇| 欧美在线视频观看免费网站| www.久久色.com| 久久精品国产精品| 热99在线视频| 91精品国产免费久久久久久| 在线视频日本亚洲性| 日韩在线视频一区| 欧美激情二区三区| 91久久国产综合久久91精品网站| 午夜剧场成人观在线视频免费观看| 国产美女精品免费电影| 国产69精品久久久久9999| 日韩中文字幕网址| 国产精品高精视频免费| 中文日韩电影网站| 亚洲欧美国产精品久久久久久久| 欧美日本黄视频| 欧美在线视频播放| 国产成人aa精品一区在线播放| 久久影视电视剧凤归四时歌| 韩日欧美一区二区| 尤物tv国产一区| 欧美大片免费观看在线观看网站推荐| 欧美一级淫片丝袜脚交| 亚洲福利视频久久| 久久久人成影片一区二区三区观看| 亚洲日韩欧美视频一区| 第一福利永久视频精品| 国产午夜精品美女视频明星a级| 亚洲伊人久久大香线蕉av| 成人日韩在线电影| 成人在线一区二区| 91网在线免费观看| 精品女同一区二区三区在线播放| 亚洲国产天堂久久国产91| 欧美成人中文字幕在线| 欧美精品亚州精品| 亚洲欧美日韩成人| 久久久91精品国产| 97精品视频在线观看| 国产精品一区二区久久国产| 精品国产一区二区三区久久久狼| 中文字幕日韩欧美在线| 中文字幕视频一区二区在线有码| 中文字幕一精品亚洲无线一区| 一区二区av在线| 亚洲精品福利在线观看| 国产乱肥老妇国产一区二| 国产69精品久久久久99| 欧美成人久久久| 久久精品亚洲94久久精品| 中文字幕日韩欧美精品在线观看| 亚洲黄色www网站| 2018中文字幕一区二区三区| 456亚洲影院| www.久久久久久.com| 在线日韩日本国产亚洲| 国产欧美一区二区三区久久| 欧美电影在线观看高清| 日日摸夜夜添一区| 日韩亚洲综合在线| 亚洲成av人影院在线观看| 中文字幕亚洲无线码在线一区| 日韩中文字幕国产精品| 日韩中文娱乐网| 日韩av在线免费观看| 欧美在线观看网站|