都說指針是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
以上內容是全由個人對現階段所學知識進行的總結整理,如果有任何問題歡迎指出!謝謝。