鱼C论坛

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

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

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

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

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

x
  1. #include <stdio.h>
  2. #include <string.h>
  3. //************************指针数组与数组指针*************************
  4. //数组指针:指向的是数组地址,不是数组的第一个元素地址
  5. int main()
  6. {
  7.    
  8.    int temp[5] =   {1,2,3,4,5};
  9.    int (*p)[5] = &temp;  //取数组的地址给数组指针
  10.    int i;
  11.    for (i = 0;i<5;i++)
  12.    {
  13.                    printf("%d\n",*(*p + i));
  14.    }
  15.    return 0;
  16. }

复制代码
最佳答案
2020-9-26 21:21:55
你运行下这个看看~应该就理解了吧
我添加的这几行打印地址,前四个打印出来的是同一个地址,但是意义不同
看后两个的地址就知道了
*p+1指向的是下一个int类型变量的地址,也就是temp[1]的地址,跳过的字节数是一个int类型变量的长度;
p+1指向的是下一个数组的地址,跳过的字节数是五个int类型变量的长度
所以说*p指向的是temp[0], p指向的是temp
  1. #include <stdio.h>
  2. #include <string.h>
  3. //************************指针数组与数组指针*************************
  4. //数组指针:指向的是数组地址,不是数组的第一个元素地址
  5. int main()
  6. {
  7.    
  8.    int temp[5] =   {1,2,3,4,5};
  9.    int (*p)[5] = &temp;  //取数组的地址给数组指针
  10.    int i;
  11.    printf("temp 地址:%p\n",temp);
  12.    printf("temp[0] 地址:%p\n",&temp[0]);
  13.    printf("*p  :%p\n",*p);
  14.    printf(" p  :%p\n",p);
  15.    printf("*p+1:%p\n",*p+1);
  16.    printf(" p+1:%p\n",p+1);
  17.    for (i = 0;i<5;i++)
  18.    {
  19.         printf("%d\n",*(*p + i));
  20.    }
  21.    return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2020-9-26 21:35:12 | 显示全部楼层
我来晚了,就什么都不说了,支持一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

这句话不对哟,没有这么分配
小甲鱼最新课程 -> https://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]的值,

这么理解对吗
小甲鱼最新课程 -> https://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]的值,

这么理解对吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

对的
小甲鱼最新课程 -> https://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 头函数在本程序中用不着,故而我将它去掉了。下面两个程序输出是完全一样的

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

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

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

  17. #endif


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

  20. //************************指针数组与数组指针*************************
  21. //数组指针:指向的是数组地址,不是数组的第一个元素地址
  22. int main()
  23. {
  24.    
  25.    int temp[5] =   {1,2,3,4,5};
  26.    int (*p)[5] = &temp;  // 取数组的地址给数组指针
  27.    int i;
  28.    for (i = 0;i<5;i++)
  29.    {
  30.         printf("%d\n",*(*p + i)); // *p是取数组指针的地址,*p + i 得到第 i 个数组指针保存的地址,*(*p + i) 取该数组指针所指向地址的值
  31.    }
  32.    return 0;
  33. }

  34. #endif
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 20:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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