指针与指针变量的区别
- 指针;一个变量的地址
- 指针变量;一种变量专门存放地址
- 指针变量的值是**(指针)**地址
一维数组
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)
后面这些确实有点难理解。