行指標和列指標的理解
指標與二維陣列
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
我們以為,二維陣列的儲存形式是:
但是,二維陣列實際上是以一維陣列為單位連續儲存的。
這樣,上述的二維陣列就可以看成是“特殊的”一維陣列了。
而陣列名a是這個“特殊的”一維陣列的名稱,也就是首地址(常量地址),也就是第一個元素的地址。
也就是第一行的首地址,是指首行一整行,並不是指某個具體元素。
對於這種,我們稱之為“行指標”。同理:a+0,a+1,a+2,都是行指標。
接下來,我們來放大觀看首行,首行的元素分別是:a[0][0],a[0][1],a[0][2],a[0][3]。
將其看作一個獨立的一維陣列,那麼 a[0]就是這個陣列的名稱,也就是這個陣列的首地址。
也就是第一個元素的地址,也就是a[0]+0。a[0]和a[0]+0都是指具體的元素。
對於這種,我們稱之為“列指標”。
由上面的比較可以得出:
行指標:指向某一行,不指向具體的元素。
列指標:指向行中具體的元素。
也就是說,列指標只要在同一行,不管它們指向行中的哪個元素,它們的行地址都是在同一行的地址,所以它們的行地址都是一樣的。
所以,&列指標--->行指標
相反地可以推出:
*行指標---->列指標
對於元素a[1][2],其地址用列指標表示為
那麼如何宣告行指標呢?
對於陣列a[3][4],可以這樣宣告(並初始化)行指標:
int (*ptr)[4]=a;
//注意行指標是一行中所有元素所共有的,所以應該等於列數
由上面可知:
行指標-->列指標:
a+i --> *(a+i) 或a[i]
這裡還要注意:
宣告和初始化列指標時,要注意“*”如:
int *ptr=*a;//true
int *ptr=a; //error
下面是應用:
#include<stdio.h> /** 三個學生修四門功課,求總平均分,輸出第n個學生成績 */ void average(float *p, int n); void search(float (*p)[4], int n); int main() { float score[3][4] = {{20,30,40,50},{25,35,45,55},{60,70,80,90}}; average(*score,12); //*score為列指標 search(score,2); //score為行指標 return 0; } void average(float *p, int n) { float *p_end,sum=0,aver; p_end = p+n-1; for(;p<p_end;p++) sum=sum+(*p); aver=sum/n; printf("average=%5.2f\n",aver); } void search(float (*p)[4], int n) { int i; printf("No.%d :\n",n); for(i=0;i<4;i++) printf("%5.2f ",*(*(p+n)+i)); }
本文稍有借鑑:https://blog.csdn.net/haussuden/article/details/5965304
以及:https://wenku.baidu.com/view/acf838ef856a561252d36fe3.html
有不足之處,歡迎指出。