指標與陣列
一、指向陣列元素的指標
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] 的形式。