指針與指針變量的區別
- 指針;一個變量的地址
- 指針變量;一種變量專門存放地址
- 指針變量的值是**(指針)**地址
一維數組
int a[4]={1,2,3,4};
學過C++的都知道一維數組的名字就是首地址;
所以可以如下表,如果int *p=a;
a==&a[0] | p==&a[0] |
---|---|
a+1==&a[1] | p+1=&a[1] |
可以說a與p等效
通過指針訪問一維數組
a==&a[0] | a+1==&a[1] |
---|---|
*a=a[0] | *(a+1)===a[1] |
關於以下文章我也是學習以下鏈接;
點這裏
二維數組(數組的數組)
指向元素
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *p=&a[0][0];
第i行第j列實際上是第i*c+j個元素(其中c是列數)
但又不能像一維數組一樣p==a;
第i*c+j
個元素地址偏移量4*(i*c+j)
故,a[i][j]=*(p+i*c+j)
首地址+偏移量;
訪問二維數組
a[0]==&a[0][0] | a[0]+1==&a[0][1] |
---|---|
*a[0]==a[0][0] | *(a[1]+2)==a[1][2] |
指向每一行的指針
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *p=a[0];
這裏不讓p==a;我們說二維數組是數組的數組;
此時p=a[0];相當於p=第0行;
如果要指向第1行int *p=a[1];
要輸出a[i][j]=*(p+j)
需要提前指定p指向某一行,且此方法必須知道行數;
指向整個數組的指針
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p)[4]=a;
首先要知道a;無論一維數組或者二維數組,數組名a==a[0]
可以把*p看作b,b[4]=a;則*p==a[0]; *(*p)==a[0][0];
[4]是四個元素
則a[i][j]=*(*(p+i)+j)
後面這些確實有點難理解。