指針(2)指針數組、數組指針、數組指針數組

都說指針是C語言的精華所在。今天繼續對指針的探索!

指針下

一、指針數組、數組指針

       指針數組:是存放指針的數組。    如 int *p[5];  該數組長度爲5,存放的是指向整型變量的指針。

       數組指針:是一個指向數組的指針。 如 int (*p)[5];  這是一個指向長度爲5的整型數組的指針。

     1.數組指針在一維數組中的應用

                   int a[5]={0};

                   a;//表示數組首元素的地址    &a;//表示數組的地址     雖然它倆取值相同,但是意義卻不同。

                   因此可以有:   int (*p1)[5];     p1=&a;//ok                p1=a;//error!

                                            int p2;             p2=&a;//error!           p2=a;//ok

                    p1=&a;//表示的是一個指向數組長度爲5的數組 的指針。

                    p2=a;//表示的是指向了一個數組的首地址,也就是一個元素的地址。

                    所以我們在使用時一定要搞清楚,我們想要的是一個元素的地址,還是一個數組的地址。

     2.如何用數組指針獲取一維數組的元素?

                  (*p1)[i]==a[i];

                    數組指針(*p1)可以替換數組名 a進行工作。區別在於,一維數組名a相當於一個一級指針常量。而p1是一個指針  

                    變量。因此a不可變,而p1不僅可以指向數組a,還可以指向其它滿足要求的數組。(已在vc++6.0環境下驗證)

      編碼驗證:

#include <stdui.h>
int main()
{
	int a[5]={0};
//驗證a 與 &a的取值相同
	printf("%p\n",a);
	printf("%p\n",&a);

//驗證 a 與 &a 雖然取值相同但是意義不同。
        int (*p1)[5];
	p1=a;//會報錯
	p1=&a;

	int *p2;
	p2=&a;//會報錯
	p2=a;

//驗證數組指針在一維數組中使用方式  (*p1)[i]==a[i];
        for(int i=0;i<5;i++)
	{
		(*p1)[i]=5;//== a[i]=5;
	}
	for(i=0;i<5;i++)
	{
		printf("%d ",a[i]);//5 5 5 5 5
	}
	printf("\n");

//驗證數組指針爲變量,可以被再次賦值。
	int b[5]={0};
	p1=&b;
	for(i=0;i<5;i++)//數組指針p1被再次賦值後,對原先被指的數組無影響。
	{
		printf("%d ",a[i]);// 5 5 5 5 5
	}
	printf("\n");
	for(i=0;i<5;i++)
	{
		printf("%d ",(*p1)[i]);// 0 0 0 0 0
	}
	printf("\n");
	return 0;
}

     3.數組指針在二維數組中的應用

              int a[3][4]={0};
              int (*p)[4];     p=a;  //將二維數組中的第一個一維數組的地址賦值給p 即此時p=a[0];也就是第一行元素的地址

             這裏a是一個二維數組的數組名,相當於一個二級指針常量;
             p是一個指針變量,它指向一個包含5個int元素的一維數組,此時p的增量以它所指向的一維數組長度爲單位;

             也就是說,此時由 p=a;則p此時指向的是a[0]的地址(第一行的地址),當p+1時,指向的是a[1]的地址(第二行的地

             址)即當p+-整數的時候,是以它指向的一維數組的長度爲單位發生移動的。

             用數組指針獲取二維數組元素:
            *(p+i)是一維數組a[i][0]的地址;
            *(p+2)+3表示a[2][3]地址(第一行爲0行,第一列爲0列),*(*(p+2)+3)表示a[2][3]的值。

二、數組指針數組:用來存儲數組指針的數組 (瞭解就好,感覺自己理解的還並不夠徹底!)

            如:int (*parr[3])[4];  

             表示:(parr[i])[4]中存儲的是一個 長度爲4的一維數組的地址。 parr[i][0]相當於該一維數組地址的首地址

             用*(parr[i][0]+j)來獲取二維數組中的元素值

             編碼示例:

#include<stdio.h>
int main()
{
	int a[3][4]={0};
	//定義 數組指針數組 parr 
	int (*parr[3])[4];
	int i,j;
	//給 parr數組賦值。
       for(i=0;i<3;i++)
	{
	    parr[i]=&a[i];
	}
	//用數組指針數組 parr 改變被指向的二維數組內的值 	*(parr[i][0]+j
	for(i=0;i<3;i++)
	{
		for( j=0;j<4;j++)
		{
			*(parr[i][0]+j)=3;
		}
	}
	//驗證上述操作是否有效。輸出應爲3*4的矩陣且 值全爲3
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

後續 指針3

以上內容是全由個人對現階段所學知識進行的總結整理,如果有任何問題歡迎指出!謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章