(一)引用數組元素時指針的運算 如果指針變數p已指向數組中的一個元素,則p+1指向同一數組的下一個元素,p-1指向同一數組的上一個元素。 附:P+1並不是簡單將值+1,而是加上元素所占的位元組數。 int、float、long都是占4個位元組,char占一個位元組。 (二)*p++、*(p++)、*(++ ...
(一)引用數組元素時指針的運算
如果指針變數p已指向數組中的一個元素,則p+1指向同一數組的下一個元素,p-1指向同一數組的上一個元素。
附:P+1並不是簡單將值+1,而是加上元素所占的位元組數。
int、float、long都是占4個位元組,char占一個位元組。
(二)*p++、*(p++)、*(++P)、++(*p)、*(p--)、*(--p)之間的區別
*p++先執行*p,再指向下一元素
*(p++)和*p++一樣,因為++和*是相同優先順序,結合方向自右向左
*(++p)先使p++指向下一元素,在取*p
++(*p)先執行*p,然後將p指向元素的值+1
*(p--)先執行*p,然後p再自減
*(--p)則是p先自減,然後再取*p
(三)用數組名做函數參數
用變數名作為函數參數時傳遞的是變數的值,而用數組名做函數參數時,傳遞的是數組首元素地址
例如,實現將數組中n個整數按相反順序存放
1 #include<stdio.h> 2 int main(){ 3 void inv(int x[],int n); 4 int i,a[10]={3,7,9,11,0,6,7,5,4,2}; 5 6 inv(a,10); //用數組名做參數傳遞的是數組首元素地址 7 for(i=0;i<10;i++) 8 printf("%d",a[i]); 9 return 0; 10 } 11 //inv函數用來交換兩個數組元素 12 void inv(int x[],int n){ // 實參把數組a的首元素地址傳到形參 13 int temp,i,j,m=(n-1)/2; 14 for(i=0;i<=m;i++){ 15 j=n-1-i; 16 temp=x[i];x[i]=x[j];x[j]=temp; 17 } 18 }
(四)通過指針引用多維數組
1.多維數組元素地址問題
假如存在一個二維數組 int a[3][4]
a+1代表的是a[1]的首元素地址,也就是第一行首元素的地址
a[0]+1代表的是第0行第一個元素的地址
*(a+0)+1代表的也是第0行第一個元素的地址
*(*(a+0)+1)代表的是第0行第一個元素的值
總結:
二維數組名是指向行的,一維數組名是指向列的。
在指向行的指針前面加一個*,就轉換成指向列的指針 如:*a指向第0行第0列
在指向列的指針前面加一個&,就轉換成指向行的指針 如:&a[0]指向第0行
(五)指向數組的指針
引入一個例子,該例子為查找有一門以上課程不及格學生的全部成績
1 #include<stdio.h> 2 int main(){ 3 void search(float (*p)[4],int n); //(*p)[4]是指向含有4個元素的一維數組的指針變數 4 float score[2][4]={{65,57,70,60},{58,87,90,81}}; 5 6 search(score,2); //score與(*p)[4]要類型一致 7 return 0; 8 } 9 10 void search(float (*p)[4],int n){ 11 int i,j,flag; 12 for(j=0;j<n;j++){ 13 flag=0; 14 for(i=0;i<4;i++) 15 if(*(*(p+j)+i)<60) flag=1; 16 if(flag==1){ 17 for(i=0;i<4;i++){ 18 printf("%5.1f",*(*(p+j)+i)); 19 } 20 printf("\n"); 21 } 22 } 23 }