一维数组和指针
a为数组名,可以代表数组的首地址,等效于a[0]的地址
数组的地址是连续的
#include<stdio.h>
void main()
{
int a[5], *p;
p = a;
for (int i = 0; i < 5; i++)
}
p++,等效于a+i
二维数组和指针
二维数组的元素地址也都是连续的
可以降维以一维数组来理解
行
&a[0][0]表示第0行0列的地址,等效于a[0]+0,个人理解为(和一维数组a+0类似,即a[0]代表二维数组首地址,等效于a[0][0]地址)
#include<stdio.h>
void main()
{
int a[5][5];
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%12d", &a[i][j]);
}
printf("\n");
}
}
#include<stdio.h>
void main()
{
int a[5][5],*p;
p = a[0];
for (int i = 0; i < 5; i++)
{
printf("%d\n",p++);
}
}
p=a[0],等同于p=&a[0][0];p++等同于a[0]+n;
列
#include<stdio.h>
void main()
{
int a[5][5], (*p)[5];
p = a;
for (int i = 0; i < 5; i++)
{
printf("%d\n",p++);
}
}
(*p)[5]代表的是一列,p=a等效于p=&a[0],代表第一列的第一个元素的地址赋值给指针变量p。后面的p++自增,每个都相差四个元素的地址,正好是第一列的全部元素的地址。
个人理解,(*p)[5]就是将某一列单独拿出来,降为一个一维数组,然后读取这个一维数组的地址
#include<stdio.h>
void main()
{
int a[5][5], (*p)[5];
p = &a[0];
for (int i = 0; i < 1; i++)
{
printf("%d\n", p);
printf("%d\n", p+1);
printf("%d\n", *p+1);
printf("%d\n", *(p+1));
}
}
个人理解,
p表示第一个盒子所在的位置,根据指针所讲,可知盒子所在的位置和里面存放的第一个内容相等
p+1表示第二个盒子所在的位置,根据指针所讲,可知盒子所在的位置和里面存放的第一个内容相等
*p+1表示第一个盒子里面的,第二个内容
*(p+1)表示第二个盒子里面的,第一个内容