2个回答
展开全部
详细分析如下:
#include <stdio.h>
int main()
{
int a[5][2] = {0,1,2,3,4,5,6,7,8,9};
int *p = a[0];
int (*p2)[2] = &a[1];
int *p1[5] = {a[0],a[1],a[2],a[3],a[4]};
int **t = p1;
++p;
++p2;
printf("a = %p\n", a);
printf("a[0] = %p\n", a[0]);
printf("&a[0] = %p\n\n", &a[0]);
printf("*p = %d\n", *p);
printf("**p2 = %d\n", **p2);
printf("p2[1][2] = %d\n", p2[1][2]);
printf("*p1[3] = %d\n", *p1[3]);
printf("t[2][1] = %d\n", t[2][1]);
return 0;
}
/**
**运行结果:
a = 000000000061FDE0
a[0] = 000000000061FDE0
&a[0] = 000000000061FDE0
*p = 1
**p2 = 4
p2[1][2] = 8
*p1[3] = 6
t[2][1] = 5
**分析如下:
int a[5][2] = {0,1,2,3,4,5,6,7,8,9};
<==>
int a[5][2] = {
{0,1},
{2,3},
{4,5},
{6,7},
{8,9}
};
a是一个二维数组,a[0]...a[4]则是一维数组,a[0]是一维数组名。数组名的值代表的是数组首元素的地址。
int *p = a[0] 表示指针p指向一维数组a[0],而一维数组a[0]的值就是首元素a[0][0]的地址,即&a[0][0],所以int *p = a[0] <==> int *p=&a[0][0];
++p 则p指向a[0]数组的下一个元素,即a[0][1], 所以 *p = 1
指针p2 是一个指向 int[2]数组类型的指针变量,它的指针类型是int(*)[2]。
int (*p2)[2] = &a[1]; 表示指针p2指向了一维数组a[1], 可以把p2看做是二维数组的行指针,初始指向二维数组a的第二行。
++p2 则p2指针指向二维数组a的下一行,即指向了一维数组a[3],即 p2 = &a[2], 所以**p2 就是a[2][0]的值=4,故**p2 = 4
p2[1][2] 此时p2是指向一维数组a[2]的,p2[1] <==> *(p2+1)的,那么(p2+1)指向的是一维数组a[3]了,*(p2+1)就是&a[3][0]
p2[1][2] <==> *(*(p2+1)+2),即 *(&a[3][0]+2) 实际上就是取a[4][0]的值了,所以 p2[1][2] = 8。
记住p2是行指针,(p2+1)就指向二维数组的下一行了。
p1 它是一个指针数组,它的元素值是一级指针a[0]...a[4]
p1[3]的值是a[3],*p1[3]就是取一维数组a[3]的首元素的值,即a[3][0]=6,所以*p1[3]=6
t 是一个二级指针,所谓二级指针就是指向指针的指针,即它存放的是指针变量所占内存单元的地址,因为指针变量本身也是要占用内存空间的。
t初始指向一级指针p1[0]的,即a[0]。t[2] = *(t+2),即指针数组p1[2]的值=a[2]。
t[2][1] <==>*(t[2]+1) <==> *(a[2]+1),即a[2][1]的值=5,所以 t[2][1]=5
*/
#include <stdio.h>
int main()
{
int a[5][2] = {0,1,2,3,4,5,6,7,8,9};
int *p = a[0];
int (*p2)[2] = &a[1];
int *p1[5] = {a[0],a[1],a[2],a[3],a[4]};
int **t = p1;
++p;
++p2;
printf("a = %p\n", a);
printf("a[0] = %p\n", a[0]);
printf("&a[0] = %p\n\n", &a[0]);
printf("*p = %d\n", *p);
printf("**p2 = %d\n", **p2);
printf("p2[1][2] = %d\n", p2[1][2]);
printf("*p1[3] = %d\n", *p1[3]);
printf("t[2][1] = %d\n", t[2][1]);
return 0;
}
/**
**运行结果:
a = 000000000061FDE0
a[0] = 000000000061FDE0
&a[0] = 000000000061FDE0
*p = 1
**p2 = 4
p2[1][2] = 8
*p1[3] = 6
t[2][1] = 5
**分析如下:
int a[5][2] = {0,1,2,3,4,5,6,7,8,9};
<==>
int a[5][2] = {
{0,1},
{2,3},
{4,5},
{6,7},
{8,9}
};
a是一个二维数组,a[0]...a[4]则是一维数组,a[0]是一维数组名。数组名的值代表的是数组首元素的地址。
int *p = a[0] 表示指针p指向一维数组a[0],而一维数组a[0]的值就是首元素a[0][0]的地址,即&a[0][0],所以int *p = a[0] <==> int *p=&a[0][0];
++p 则p指向a[0]数组的下一个元素,即a[0][1], 所以 *p = 1
指针p2 是一个指向 int[2]数组类型的指针变量,它的指针类型是int(*)[2]。
int (*p2)[2] = &a[1]; 表示指针p2指向了一维数组a[1], 可以把p2看做是二维数组的行指针,初始指向二维数组a的第二行。
++p2 则p2指针指向二维数组a的下一行,即指向了一维数组a[3],即 p2 = &a[2], 所以**p2 就是a[2][0]的值=4,故**p2 = 4
p2[1][2] 此时p2是指向一维数组a[2]的,p2[1] <==> *(p2+1)的,那么(p2+1)指向的是一维数组a[3]了,*(p2+1)就是&a[3][0]
p2[1][2] <==> *(*(p2+1)+2),即 *(&a[3][0]+2) 实际上就是取a[4][0]的值了,所以 p2[1][2] = 8。
记住p2是行指针,(p2+1)就指向二维数组的下一行了。
p1 它是一个指针数组,它的元素值是一级指针a[0]...a[4]
p1[3]的值是a[3],*p1[3]就是取一维数组a[3]的首元素的值,即a[3][0]=6,所以*p1[3]=6
t 是一个二级指针,所谓二级指针就是指向指针的指针,即它存放的是指针变量所占内存单元的地址,因为指针变量本身也是要占用内存空间的。
t初始指向一级指针p1[0]的,即a[0]。t[2] = *(t+2),即指针数组p1[2]的值=a[2]。
t[2][1] <==>*(t[2]+1) <==> *(a[2]+1),即a[2][1]的值=5,所以 t[2][1]=5
*/
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询