C程式設計--指標(對 “ 陣列 ” 進行輸入輸出操作)
阿新 • • 發佈:2018-11-11
指標引用陣列元素
- 方法一、下標法 : 如a[i]形式
- 方法二、指標法 : 如*(a+i)、*(p+i)形式。其中a是陣列名,p是指向陣列元素的指標變數
** 問題:有一個整形陣列a,有10個元素,要求輸出陣列中的全部元素**
- 下標法
#include<stdio.h>
int main(){
int a[5]={5,0,3,1,2};
for(int i=0;i<5;i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
- 通過陣列名計算陣列元素的地址,找出元素的值
#include<stdio.h>
int main(){
//若需手動輸入可以在迴圈中使用:scanf("%d",a+i);來代替scanf("%d",&a[i]);
int a[5]={5,0,3,1,2};
for(int i=0;i<5;i++){
printf("%d ",*(a+i));
}
printf("\n");
return 0;
}
或者:
#include<stdio.h> int main(){ int a[5]={5,0,3,1,2}; int *p=a; //另外用指標指向陣列,但不能寫成: int *p=&a;(錯誤原因:cannot convert from 'int (*)[5]' to 'int *') for(int i=0;i<5;i++){ printf("%d ",*(p+i)); } printf("\n"); return 0; }
補充說明:
#include<stdio.h>
int main(){
int a[5]={5,0,3,1,2};
int (*p)[5]=&a; // 可以用指向一維陣列的指標實現
//(*p)[5]:
//型別表示:int (*)[4];
//含義:p為一個指標變數,指向含有5個元素的一維陣列;
//多用於多維陣列的處理中;
for(int i=0;i<5;i++){
printf("%d ",*(*(p)+i));
}
printf("\n");
return 0;
}
- 用指標變數指向陣列元素
#include<stdio.h> int main(){ int a[5]={5,0,3,1,2}; int *p; for(p=a;p<(a+5);p++){ printf("%d ",*p); } printf("\n"); return 0; }
用指標變數輸入資料並輸出資料
#include<stdio.h>
int main(){
int a[5];
int *p=a;
for(int i=0;i<5;i++){//輸入操作
scanf("%d",p+i);
//等價scanf("%d",p++);
//等價於scanf("%d",&a[i]);
//等價於scanf("%d",a+i); //a代表陣列首元素地址,它是一個指標型常量,程式執行期間值不變(不同於p),故不能用a++;
}
//輸出方式一:用 a[i] 或用 *(a+i) ; 但不能使用a++(原因:a是指標型常量)
for(i=0;i<5;i++){
printf("%d ",a[i]);//等價於 printf("%d ",*(a+i));
}
printf("\n");
p=a;//必須把指標重新指向a的首元素
//輸出方式二:用 *(p+i) 或者 *p++ ; 注意:要把指標重新指向a的首元素
for(i=0;i<5;i++){
printf("%d ",*(p+i));//等價於 printf("%d ",*p++);
}
printf("\n");
//輸出方式三:用*p
for(p=a;p<(a+5);p++){
printf("%d ",*p);
}
putchar(10);//等價於printf("\n");
return 0;
}
注意
- *p++ : 等同於 *(p++);因為++和 *同優先順序;先引用p的值,實現 *p的運算,然後p自增1;
- *(p++) 不等同於 *(++p) ;(假設p的初值為a,即&a[0])
前者 *(p++) :① *p ②p++ ; 若輸出 *(p++),得到a[0]的值;
後者 *(++p):①p++ ② *p; 若輸出 *(++p),得到a[1]的值; - ++(*p):表示p所指向的元素值+1;假設p=a,則++(*p)相當於++a[0];
注意:是元素的值加1,而不是指標p的值加1;