當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 指針數(shù)組與數(shù)組指針
了解了關(guān)于指針的基本內(nèi)容后,針對于指針的高級內(nèi)容,比如說指針數(shù)組和數(shù)組指針是經(jīng)常容易混淆的兩個概念,下面我就跟大家簡單的介紹關(guān)于這兩個概念的理解與記憶。
要想了解指針數(shù)組和數(shù)組指針這兩個概念,那就得先來看一下指針和數(shù)組之間一些說不清的關(guān)系。
1. 指針與一維數(shù)組:直接上例子
舉例:打印數(shù)組的內(nèi)容:
Int a[4] = {1,2,3,4}, i;
Int *p = a;
For(I = 0; I < 4; i++)
{
Printf(“a[%d]=%d”, I, a[i]);
Printf(“a[%d]=%d”, I, *(p+i));//解釋:p指針指向了數(shù)組a,數(shù)組是連續(xù)的地址,在前面的內(nèi)容中學(xué)到,p+i是指向地址大的方向移動i個數(shù)據(jù),p+I ==&a[i]
Printf(“a[%d]=%d”, I, p[i]);
Printf(“a[%d]=%d”, I, *(a+i));
}
舉例:那打印數(shù)組的地址呢??
注意:從上面的例子可以看出:
數(shù)組的內(nèi)容:a[i] == p[i] == *(p+i) == *(a+i)
數(shù)組的地址:&a[i] == &p[i] == p+I == a+i
在這里很多人可能會想指針與數(shù)組好像沒有多大的區(qū)別,數(shù)組可以用指針來代替,但實際上兩者之間存在一個本質(zhì)的區(qū)別,那就是:數(shù)組名它是一個地址常量,指針是指針變量。
如: int a[3] = {1,2,3}, *p = a;
Printf(“%p\n”, p++);
Printf(“%p\n”, a++);//錯:a++ a=a+1,a是地址常量,常量是不能被賦值的
Printf(“%p\n”, a+1);//對:a+1并沒有進(jìn)行賦值運算
2. 指針與二維數(shù)組:
對二維數(shù)組的理解:可以把二維數(shù)組看作由多個一維數(shù)組組成,如int a[2][3],可以理解成兩個一維數(shù)組:a[0](是一個一維數(shù)組名,包含三個元素a[0][0]\a[0][1]\a[0][2])和a[1](包含三個元素:a[1][0]\a[1][1]\a[1][2])
思考:
1. 數(shù)組int a[2][3],如何表達(dá)第二行第二列元素的地址?
&a[1][1]、&a[1][0]+1、a[1]+1、*(a+1)+1
2. 數(shù)組int a[2][3],如何表達(dá)第二行第二列元素的元素?
a[1][1]、*(&a[1][0]+1)、*(a[1]+1)、*(*(a+1)+1)
到目前為止只是二維數(shù)組的一個相應(yīng)操作,那把二維數(shù)組和指針牽扯上關(guān)系后會怎么樣呢??接下來看我們的指針數(shù)組和數(shù)組指針。
注意:
數(shù)組的內(nèi)容:a[i][j] == *(a[i]+j) == *(*(a+i)+j)
數(shù)組的地址:&a[i][j] == a[i]+j == *(a+i)+j
3. 指針數(shù)組:數(shù)組,指由若干個具有相同存儲類型和數(shù)據(jù)類型的指針變量構(gòu)成的集合,數(shù)組的元素是指針的數(shù)組。
形式:<存儲類型> <數(shù)據(jù)類型> *<指針變量數(shù)組名>[<數(shù)組大小>];
int *p[3];
舉例:
int a[2][3] = {{1,2,3},{4,5,6}};
int *p[2] = {a[0], a[1]}, i, j;
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
{
//printf("&a[%d][%d]=%p ", i, j, &a[i][j]);
//printf("&a[%d][%d]=%p ", i, j, a[i] +j);
//printf("&a[%d][%d]=%p ", i, j, *(a+i)+j);
//printf("&a[%d][%d]=%p ", i, j, &p[i][j]);
//printf("&a[%d][%d]=%p ", i, j, p[i]+j);
printf("&a[%d][%d]=%p ", i, j, *(p+i)+j);
}
}
putchar(10);
注意:
地址:&a[i][j] <==> a[i] + j <==> *(a+i) + j <==> *(p+i)+j <==> p[i] + j <==>&p[i][j]
內(nèi)容:a[i][j] <==> *(a[i] + j) <==> *(*(a+i) + j) <==> *(*(p+i)+j) <==> *(p[i] + j) <==>p[i][j]
4. 數(shù)組指針:指針,指向數(shù)組的指針,指向特定位數(shù)數(shù)組的指針(指向一個有三個int 型元素數(shù)組的指針,指針加一,指針偏移12個字節(jié))
形式:<存儲類型> <數(shù)據(jù)類型> *<指針變量數(shù)組名>[<數(shù)組大小>];
int (*p)[3];
1) 指向一維的:
如:int a[4] int [4]a INT a
Int (*p)[4] int [4](*p) INT (*p)
所以等價關(guān)系為:p = &a
舉例:
Int a[4] = {1,2,3,4};
Int (*p)[4], i;
P = &a;
For(I = 0; I < 4;i++)
{
Printf(“%d\n”, (*p)[i]);
Printf(“%d\n”, *((*p)+i));
Printf(“%p\n”, (*p)+i);
}
注意:
地址:(*p)+i
內(nèi)容:*((*p)+i)、(*p)[i]
2) 指向二維的:
如:int a[3][4] int [4] a[3] INT [4] a[3]
Int (*p)[4] int [4] (*p) INT [4] (*p)
所以等價關(guān)系為:p = a
舉例:
int a[3][4] = {11,22,33,44,55,66,77,88,99,100,110,120};
int (*p)[4] = a;
int i = 0,j = 0;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
//printf("%d ",p[i][j]);
//printf("%d ",*(p[i] + j));
printf("%d ",*(*(p + i) + j));
}
putchar(10);
}
以上便是我對于指針數(shù)組和數(shù)組指針的理解,希望能夠?qū)ψx者有所幫助!