1. 程式人生 > >指標與陣列

指標與陣列

一、指向陣列元素的指標

1、定義指向陣列元素的指標

每個陣列元素相當於一個變數,所以定義指向陣列元素的指標與定義指向變數的指標方法相同。例如:

int ia[5];   /*定義包含5個數組元素的整型陣列ia*/
int *pi;    /*定義指向整型變數的指標變數pi*/
pi=&ia[0];   /*使指標變數pi指向陣列的第0個元素*/

在C中,陣列名就代表陣列儲存的首地址,也就是陣列中第一個陣列元素的地址,所以ia和&ia[0]的值相同。所以,下面的兩個語句是等價的:

pi=&ia[0];
pi=ia;
2、通過指標變數使用陣列元素

(1)*pi 相當於ia[0],即指標所指向的陣列元素ia[0] (2)*(pi + ii)相當於ia[ii],即陣列元素ia[ii] (3)pi[ii] 相當於 ia[ii],與*(pi + ii )等價 (4)pi + ii 相當於 &ia[ ii ],即陣列元素ia[ ii ]的地址

二、指標與字串

首先說明一下,C++表示字串的資料型別就是string,在C語言中才是用char型的陣列儲存字串(在C中沒有string來定義一個變數為字串型別)。

指向陣列的指標最常見的應用是將指標指向字串。

在C中,通過兩種方法使用一個字串,一是使用字元陣列,二是使用字元指標。 例1: 使用字元陣列。

#include<stdio.h>
void main(){
        char cstring1[] = "A string to be copied.";
        char cstring2[50];
        int i;
        for(i=0;
cstring1[i]!='\0';i++){ cstring2[i]=cstring1[i]; } cstring2[i]='\0'; printf("cstring1的值為:%s\n",cstring1); //用“%s”輸出一個字元陣列時,遇結束符'\0'就停止輸出,因此要求字元陣列必須以'\0'結束 printf("cstring2的值為:%s\n",cstring2); }

例2: 使用字元指標。

#include<stdio.h>
void main(){
        char cstring1[
] = "A string to be copied."; char cstring2[50]; char *toc,*fromc; fromc = cstring1; toc = cstring2; for(;*fromc!='\0';fromc++,toc++){ *toc = *fromc; } *toc = '\0'; printf("cstring1的值為:%s\n",cstring1); printf("cstring2的值為:%s\n",cstring2); }

在使用字元指標變數時,應該注意: (1)在定義字元指標變數時,可以直接用字串常量作為初始值對其初始化。

char *text = "Hello World!";

上述語句定義了一個字元指標變數text,並將字串常量“Hello World!”的首地址賦值給指標變數text。上面的語句和下面的意思相同:

  char *text;
  text = "Hello World!";

(2)對於字元陣列,不能用字串常量直接賦值,如下面的語句是錯誤的:

char cstring[50];
cstring = "Hello World!";  //錯誤的

這是因為字元陣列的首地址是不能改變的。只可以在初始化時對一個字元陣列使用這種形式的賦值語句。 (C 語言 P172) (3)可以利用字元指標對字串進行整體輸出。

char *text = "Hello World"printf("%s",text);

三、指標陣列

1、什麼是指標陣列?

用指向同一資料型別的指標來構成一個數組,這就是指標陣列。 陣列中每個元素都是指標變數。定義指標陣列的一般形式為: 型別名 *陣列名[ 元素個數 ]; 例如:

int *pi[10];  //定義了一個指標陣列,pi為指標陣列名(pi是常量,代表陣列的首地址)
//共有10個數組元素,每個元素都是指向整型量的指標
2、為什麼要定義和使用指標陣列?

在指標陣列中只儲存字串的首地址,字串按照實際長度儲存,所以不存在空間浪費的情況。(在C中,字串是作為字元陣列進行儲存的,而且使用‘\0’作為字串結束的標誌指標陣列元素與字串的對應關係

例3: 將若干字串按字母順序(由小到大)排序。

如,“apple”,“able”,“zoo”,“battle”,“yellow” 排序後為: “able”,“apple”,“battle”,“yellow”,“zoo”

方法一:使用指標陣列。程式如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main(){
     char *cstring[]={"apple","able","zoo","battle","yellow"};
     char *ctemp;
     int in=5;
     int i,j,k;
     ctemp=(char *) malloc(sizeof(char)*30);
     for(i=0;i<in-1;i++){
        for(j=i+1;j<in;j++){
                k=i;

                if(strcmp(cstring[k],cstring[j])>0)
                {
                        k=j;
                }
                if(k!=i)
                {      
                        ctemp=cstring[i];
                        cstring[i]=cstring[k];
                        cstring[k]=ctemp;
                }
        }
     }
     for(i=0;i<in;i++){
        printf("%s\n",cstring[i]);
     }
}

https://ask.csdn.net/questions/707296 我在寫這個程式碼時本來打算使用strcpy函式的,但是出現了錯誤。所以最好要使用陣列就都使用陣列,要使用指標就都使用指標(指的是中間變數是陣列還是指標)。strcpy函式在C語言書P114。

方法二,使用陣列。程式如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main(){
     char cstring[10][20]={"apple","able","zoo","battle","yellow"};
     char ctemp[20];
     int in=7;
     int i,j,k,h;
     for(i=0;i<in-1;i++){
        for(j=i+1;j<in;j++){
                k=i;

                if(strcmp(cstring[k],cstring[j])>0)
                {
                        k=j;
                }
                if(k!=i)
                {      
                        strcpy(ctemp,cstring[i]);
                        strcpy(cstring[i],cstring[k]);
                        strcpy(cstring[k],ctemp);
                }
        }
     }
     for(i=0;i<in;i++){
        printf("%s\n",cstring[i]);
     }
}

四、指標與二維陣列

1、可以將二維陣列看做是一維陣列使用指標進行處理。
陣列指標

定義一個數組指標:型別名(* 指標變數名)[元素個數]; 例如:int(* pi)[4]; 它表明指標變數 pi 指向的儲存空間包含4個整型元素,即陣列指標 pi 指向一個一維陣列, pi 的值就是該陣列的首地址。

例4:使用指標輸出二維陣列的全部元素。
#include<stdio.h>
void main(){
   int ia[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
   int (* pi)[4],i,j;
   for(i=0;i<3;i++)
   {
   	pi=&ia[i];
   	for(j=0;j<4;j++){
   		printf("%d,",(*pi)[j]);
   	}
   }
   printf("\n");
}

在使用陣列指標時,應注意: pi是一個行指標,它只能指向一個包含若干元素的一維陣列,不能指向一維陣列中的元素。如果要訪問一維陣列中的某個元素,如第j個元素,可採用 (pi)[j] 的形式。