码迷,mamicode.com
首页 > 其他好文 > 详细

指针理解

时间:2018-09-08 15:31:50      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:变量   mat   固定   math.h   等于   相等   写法   sum   数组   

#include<stdio.h>
#include<math.h>

int main()
{

int sum1[10]={1,2,3,4,5,6,7,8,9,10};
int sum2[2][3]={{1,2,3},{4,5,6}};

int *p1 = sum1;
int (*p2)[3] = sum2;

printf("%d %d %d %d \n",sum1[1],*(p1+1),*(sum1+1),p1[1]);
printf("%d %d %d %d \n",sum2[1][1],*(*(p2+1)+1),*(*(sum2+1)+1),p2[1][1]);


return 0;

}

<1>sum1[1],*(p1+1),*(sum1+1),p1[1] 写法相同的理解
假设sum1的地址 = 0x10000000
1、数组名代表数组首元素地址,既然是地址,那就能看作指针,只是这个指针有点特别,他不是指针变量是指针常亮
2、sum[1] 与 *(p1 +1) 结果一致的原因
a、p1 = sum;那p1就指向了数组首元素地址,且p1是个指针变量,指针变量加1等于指针所指向的类型大小加1
所以p1+1 = 0x10000000 + sizeof(int) = 0x10000004,所以*(p1+1) = *(0x10000004) = sum[1] = 2;
b、sum[1],因为sum内容是连续存放,所以sum[1]的地址 = 0x10000000 + sizeof(int) = 0x10000004
取这个地址的内容 = 2
3、 *(sum1+1)与 *(p1+1)类似,只是这里sum1是个指针常量固定为数组首地址= 0x10000000
4、前3步确定sum1[1]=*(p1+1)=*(sum1+1),这里理解sum[1] = p1[1]
前面说了 sum[1] = 0x10000000 + sizeof(int)= 0x10000004,去取0x10000004地址里的内容 = *(0x10000004)
并且 *(p1+1) = 0x10000000 + sizeof(int) = 0x10000004 = *(0x10000004)
这里说明sum和p1代表的是同一个地址,所以sum1[1]=p[1];

<2>理解 sum2[1][1],*(*(p2+1)+1),*(*(sum2+1)+1),p2[1][1]
假设sum1的地址 = 0x10000010
有个地方要注意,sum2指向数组首元素地址, p2指向数组首地址 ,都可以看做指针,只是sum2是指针常量,p2是指针变量
a、先看*(*(p2+1)+1),因为p2是个指针变量,指针变量加1等于指针所指向的类型大小加1
int (*p2)[3] = sum2;而p2指向的类型为int ()[3];说明指向的是个一维数组假设为a[3];
p2+1 = 0x10000010 + sizeof(a[3]) = 0x10000010 + 12 = 0x1000001c
p2+1指向了一维数组的首地址,所以要读取这个这个一维数组的数据
先要对p2解引用 *(p2+1)来找到一维数组首元素的地址,所以读取一维数组第1个元素等于 *(*(p2+1)+1);
p2+1的值和*(p2+1)相等,为什么要加*,我的理解是,首地址和首元素的地址,是两个意思,首地址代表数组名,首地址代表数组
里元素的地址,所以要获取数组里的元素的地址,就要先对数组名解引用
b、其它分析类似





指针理解

标签:变量   mat   固定   math.h   等于   相等   写法   sum   数组   

原文地址:https://www.cnblogs.com/liushuhe1990/p/9609100.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!