1. 程式人生 > >行指標和列指標的理解

行指標和列指標的理解

指標與二維陣列

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[1]+2,等價表示為*(a+1)+2,那麼內容是*(*(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

有不足之處,歡迎指出。