程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 指針數組(一)

指針數組(一)

編輯:關於C語言

前面介紹了指向不同類型變量的指針的定義和使用,我們可以讓指針指向某類變量,並替代該變量在程序中使用;我們也可以讓指針指向一維、二維數組或字符數組,來替代這些數組在程序中使用,給我們在編程時帶來許多方便。

下面我們定義一種特殊的數組,這類數組存放的全部是指針,分別用於指向某類的變量,以替代這些變量在程序中的使用,增加靈活性。指針數組定義形式:

類型標識 *數組名[數組長度]

例如: 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%s",ptr1[i]);/依*此輸出ptr1數組4個指針指向的4個字符串*/
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];
/*定義指針數組、二維字符數組、用於交換的一維字符數組*/
int i,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;
int i,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完全相同。

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