猪猪虾 发表于 2020-9-26 20:55:25

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

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

sunrise085 发表于 2020-9-26 21:21:55

你运行下这个看看~应该就理解了吧
我添加的这几行打印地址,前四个打印出来的是同一个地址,但是意义不同
看后两个的地址就知道了
*p+1指向的是下一个int类型变量的地址,也就是temp的地址,跳过的字节数是一个int类型变量的长度;
p+1指向的是下一个数组的地址,跳过的字节数是五个int类型变量的长度
所以说*p指向的是temp, p指向的是temp
#include <stdio.h>
#include <string.h>
//************************指针数组与数组指针*************************
//数组指针:指向的是数组地址,不是数组的第一个元素地址
int main()
{
   
   int temp =   {1,2,3,4,5};
   int (*p) = &temp;//取数组的地址给数组指针
   int i;
   printf("temp 地址:%p\n",temp);
   printf("temp 地址:%p\n",&temp);
   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;
}

风过无痕1989 发表于 2020-9-26 21:35:12

我来晚了,就什么都不说了,支持一下

猪猪虾 发表于 2020-9-26 21:36:19

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

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

sunrise085 发表于 2020-9-26 21:47:33

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

指向了下一个不知道啥数组的数组?
只是这么一说,并不是说接下来的地址就一定是数组,重点意思是说跳过一个数组的长度。
是不是计算机的内存会分配哪些地方存数组,哪些地方存字符串?
这句话不对哟,没有这么分配

猪猪虾 发表于 2020-9-26 21:48:50

本帖最后由 猪猪虾 于 2020-9-26 21:51 编辑

风过无痕1989 发表于 2020-9-26 21:35
我来晚了,就什么都不说了,支持一下

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

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

这么理解对吗

猪猪虾 发表于 2020-9-26 21:51:26

本帖最后由 猪猪虾 于 2020-9-26 21:55 编辑

sunrise085 发表于 2020-9-26 21:47
只是这么一说,并不是说接下来的地址就一定是数组,重点意思是说跳过一个数组的长度。

这句话不对哟 ...

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

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

这么理解对吗

sunrise085 发表于 2020-9-26 21:53:45

猪猪虾 发表于 2020-9-26 21:51
别走啊,请教一下,在
int temp = {1,2,3,4,5}
int *p = temp;


对的

风过无痕1989 发表于 2020-9-26 22:01:03

猪猪虾 发表于 2020-9-26 21:51
别走啊,请教一下,在
int temp = {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 =   {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 =   {1,2,3,4,5};
   int (*p) = &temp;// 取数组的地址给数组指针
   int i;
   for (i = 0;i<5;i++)
   {
      printf("%d\n",*(*p + i)); // *p是取数组指针的地址,*p + i 得到第 i 个数组指针保存的地址,*(*p + i) 取该数组指针所指向地址的值
   }
   return 0;
}

#endif
页: [1]
查看完整版本: *(*p + i)),怎么理解,*p指向的是什么