鱼C论坛

 找回密码
 立即注册
查看: 2080|回复: 8

[已解决]*(*p + i)),怎么理解,*p指向的是什么

[复制链接]
发表于 2020-9-26 20:55:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <string.h>
//************************指针数组与数组指针************************* 
//数组指针:指向的是数组地址,不是数组的第一个元素地址 
int main()
{
   
   int temp[5] =   {1,2,3,4,5};
   int (*p)[5] = &temp;  //取数组的地址给数组指针 
   int i;
   for (i = 0;i<5;i++)
   {
                   printf("%d\n",*(*p + i));
   }
   return 0;
}
最佳答案
2020-9-26 21:21:55
你运行下这个看看~应该就理解了吧
我添加的这几行打印地址,前四个打印出来的是同一个地址,但是意义不同
看后两个的地址就知道了
*p+1指向的是下一个int类型变量的地址,也就是temp[1]的地址,跳过的字节数是一个int类型变量的长度;
p+1指向的是下一个数组的地址,跳过的字节数是五个int类型变量的长度
所以说*p指向的是temp[0], p指向的是temp
#include <stdio.h>
#include <string.h>
//************************指针数组与数组指针************************* 
//数组指针:指向的是数组地址,不是数组的第一个元素地址 
int main()
{
   
   int temp[5] =   {1,2,3,4,5};
   int (*p)[5] = &temp;  //取数组的地址给数组指针 
   int i;
   printf("temp 地址:%p\n",temp);
   printf("temp[0] 地址:%p\n",&temp[0]);
   printf("*p  :%p\n",*p);
   printf(" p  :%p\n",p);
   printf("*p+1:%p\n",*p+1);
   printf(" p+1:%p\n",p+1);
   for (i = 0;i<5;i++)
   {
        printf("%d\n",*(*p + i));
   }
   return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-26 21:21:55 | 显示全部楼层    本楼为最佳答案   
你运行下这个看看~应该就理解了吧
我添加的这几行打印地址,前四个打印出来的是同一个地址,但是意义不同
看后两个的地址就知道了
*p+1指向的是下一个int类型变量的地址,也就是temp[1]的地址,跳过的字节数是一个int类型变量的长度;
p+1指向的是下一个数组的地址,跳过的字节数是五个int类型变量的长度
所以说*p指向的是temp[0], p指向的是temp
#include <stdio.h>
#include <string.h>
//************************指针数组与数组指针************************* 
//数组指针:指向的是数组地址,不是数组的第一个元素地址 
int main()
{
   
   int temp[5] =   {1,2,3,4,5};
   int (*p)[5] = &temp;  //取数组的地址给数组指针 
   int i;
   printf("temp 地址:%p\n",temp);
   printf("temp[0] 地址:%p\n",&temp[0]);
   printf("*p  :%p\n",*p);
   printf(" p  :%p\n",p);
   printf("*p+1:%p\n",*p+1);
   printf(" p+1:%p\n",p+1);
   for (i = 0;i<5;i++)
   {
        printf("%d\n",*(*p + i));
   }
   return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-26 21:35:12 | 显示全部楼层
我来晚了,就什么都不说了,支持一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-26 21:36:19 | 显示全部楼层
sunrise085 发表于 2020-9-26 21:21
你运行下这个看看~应该就理解了吧
我添加的这几行打印地址,前四个打印出来的是同一个地址,但是意义不同
...

1.”p+1指向的是下一个数组的地址,跳过的字节数是五个int类型变量的长度“,指向了下一个不知道啥数组的数组?是不是计算机的内存会分配哪些地方存数组,哪些地方存字符串?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 21:47:33 | 显示全部楼层
猪猪虾 发表于 2020-9-26 21:36
1.”p+1指向的是下一个数组的地址,跳过的字节数是五个int类型变量的长度“,指向了下一个不知道啥数组的 ...
指向了下一个不知道啥数组的数组?

只是这么一说,并不是说接下来的地址就一定是数组,重点意思是说跳过一个数组的长度。
是不是计算机的内存会分配哪些地方存数组,哪些地方存字符串?

这句话不对哟,没有这么分配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-26 21:48:50 | 显示全部楼层
本帖最后由 猪猪虾 于 2020-9-26 21:51 编辑
风过无痕1989 发表于 2020-9-26 21:35
我来晚了,就什么都不说了,支持一下


别走啊,请教一下,在
int temp[5] = {1,2,3,4,5}
int *p = temp;
这里的temp是数组的第一个元素的地址,*p指向的是数组第一个元素的地址,(p+ i) 是指向第i个元素的地址,*(p+ i)取的是第i个元素的值

在(*p)[5] 里面,P指向的是temp这个数组,*p指向temp[0],(*p + i) 指向temp[i]元素,*(*p + i)取temp[i]的值,

这么理解对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-26 21:51:26 | 显示全部楼层
本帖最后由 猪猪虾 于 2020-9-26 21:55 编辑
sunrise085 发表于 2020-9-26 21:47
只是这么一说,并不是说接下来的地址就一定是数组,重点意思是说跳过一个数组的长度。

这句话不对哟 ...


别走啊,请教一下,在
int temp[5] = {1,2,3,4,5}
int *p = temp;
这里的temp是数组的第一个元素的地址,*p指向的是数组第一个元素的地址,(p+ i) 是指向第i个元素的地址,*(p+ i)取的是第i个元素的值

在(*p)[5] 里面,P指向的是temp这个数组,*p指向temp[0],(*p + i) 指向temp[i]元素,*(*p + i)取temp[i]的值,

这么理解对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 21:53:45 | 显示全部楼层
猪猪虾 发表于 2020-9-26 21:51
别走啊,请教一下,在
int temp[5] = {1,2,3,4,5}
int *p = temp;

对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 22:01:03 | 显示全部楼层
猪猪虾 发表于 2020-9-26 21:51
别走啊,请教一下,在
int temp[5] = {1,2,3,4,5}
int *p = temp;

sunrise085 朋友在2楼已经说得很清楚了,也写了一个程序让你理解了,我就是再说也是这样呀,这样吧,我给你一个程序,你试试看,然后再去理解2楼的解答。下面的程序,由于 string.h 头函数在本程序中用不着,故而我将它去掉了。下面两个程序输出是完全一样的
#if(0)
#include <stdio.h>

//************************指针数组与数组指针************************* 
//数组指针:指向的是数组地址,不是数组的第一个元素地址 
int main()
{
   
   int i;
   int *p,temp[5] =   {1,2,3,4,5};
   p = temp;  // 将数组的地址赋给p 

   for (i = 0;i<5;i++)
   {
       printf("%d\n",*(p + i)); // p + i 是第i个元素的地址,*(p + i)是取第i个元素的值
   }
   return 0;
}

#endif


#if(1)
#include <stdio.h>

//************************指针数组与数组指针*************************
//数组指针:指向的是数组地址,不是数组的第一个元素地址
int main()
{
   
   int temp[5] =   {1,2,3,4,5};
   int (*p)[5] = &temp;  // 取数组的地址给数组指针
   int i;
   for (i = 0;i<5;i++)
   {
        printf("%d\n",*(*p + i)); // *p是取数组指针的地址,*p + i 得到第 i 个数组指针保存的地址,*(*p + i) 取该数组指针所指向地址的值
   }
   return 0;
}

#endif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 23:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表