鱼C论坛

 找回密码
 立即注册
查看: 1750|回复: 5

[已解决]数组指针问题求教,谢谢!

[复制链接]
发表于 2019-4-30 11:07:10 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>

int main(void)
{
        int temp[5] = {1,2,3,4,5};
        int (*p2)[5] = &temp;
        int i;

        for(i=0;i<5;i++)
        {
                printf("%d\n",*(*p2+i);  //如果*p2表示数组temp的地址,那么要打印下一个元素为什么只是给地址加1?整形变量不应该占4个字节吗,地址为什么不加4?
        }

        return 0;
}
最佳答案
2019-5-1 16:56:56
只需要记着指针+1,不是只加一个字节!取决于对应指针的类型,在64位编译器的环境下:
char *p    p+1代表p加1个字节
int *p    p+1代表p加4个字节
float *p    p+1代表p加4个字节
double *p    p+1代表p加8个字节
。。。

没有什么好理解不好理解的,就是这么规定的!
可以参考以下程序加以验证!
#include <stdio.h>

int main()
{
  
  char *s="abcd";
  printf("%p\n",s);
  printf("%p\n",s+1);

  printf(".........\n");

  int *temp="abcd";
  printf("%p\n",temp);
  printf("%p\n",temp+1);
  return 0;
}

//输出结果
// 0x400634
// 0x400635
// .........
// 0x400634
// 0x400638
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-30 11:43:54 | 显示全部楼层
本帖最后由 jackz007 于 2019-4-30 11:46 编辑

      int (*p2)[5] 定义 p2 是指向末维是 5 的二维整型数组的指针,这就意味着,如果 p2 ++ 就会直接跨过 5 个整型元素, int 型数值占用 4 个字节,那么,跨度就是 5 x 4 = 20 个字节,就是说,p2 的数值将会增加 20,而不是 1 也不是 5。
      明白了这个道理再看你的代码就好理解了
 p2 = & temp
 * p2 = temp = & temp[0]
 * p2 + i = & temp[i]
 *(* p2 + i) = temp[i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-30 15:05:44 | 显示全部楼层
地址加1不是加一个字节,加的是其对应变量的字节数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-30 15:27:41 | 显示全部楼层
  int (*p2)[5] = &temp;
第一个问题:
p2表示数组temp的地址(&temp),p2的类型是 int(*)[5];
*p2表示的是数组首个元素的地址  (*(&temp) = temp),*p2的类型是 int *;
*p2+i 可以看成是 temp+i , *(*p2+i)也就可以看成*(temp+i),这个我记得小甲鱼的课程里面有讲,就是temp[i];
所以打印的时候,i++就可以了,和你平时打印数组一样。
第二个问题:
*p2+i 里面的*p2是 int * 类型;
i,单位是 int * 的步长(4Byte);
举个不是很恰当的例子,假如1分钟有4秒,1小时有5分钟;其中p2就是时针,*p2就是分针,1Byte就是秒的刻度;
其中*p2走一格(*p2+1),就是1分钟,4秒(4Byte);而不是1秒(1Byte);
其中p2 走一格(p2+1),就是1小时,20秒(5*4Byte);
这里*P2+1,本来就是针对int*加一个步长(4Byte),所以不用加4。

仔细看一下上面大佬列的那些代码,都打印出来看看就会明白了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-1 16:56:56 | 显示全部楼层    本楼为最佳答案   
只需要记着指针+1,不是只加一个字节!取决于对应指针的类型,在64位编译器的环境下:
char *p    p+1代表p加1个字节
int *p    p+1代表p加4个字节
float *p    p+1代表p加4个字节
double *p    p+1代表p加8个字节
。。。

没有什么好理解不好理解的,就是这么规定的!
可以参考以下程序加以验证!
#include <stdio.h>

int main()
{
  
  char *s="abcd";
  printf("%p\n",s);
  printf("%p\n",s+1);

  printf(".........\n");

  int *temp="abcd";
  printf("%p\n",temp);
  printf("%p\n",temp+1);
  return 0;
}

//输出结果
// 0x400634
// 0x400635
// .........
// 0x400634
// 0x400638
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-2 11:02:35 | 显示全部楼层
指针的值+1并不是真实地址加1 如果是int型那么就+4字节 以此类推
其实编译器会自动的帮你选择一个合适的偏移值加在指针上(根据指针类型)
如果用64位系统 那么int型是4Byte 32位是2Byte 难道程序员还要考虑运行环境的问题吗 这些都由编译器来决定
还有 如果就像你说的那样 指针就不需要规定类型了 其实指针规定类型也是因为不同类型所偏移的空间不同
其实上面已经有人回答的很清楚了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 03:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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