鱼C论坛

 找回密码
 立即注册
查看: 1183|回复: 7

[已解决]【求助】关于数组指针跨度问题

[复制链接]
发表于 2021-7-28 19:27:27 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. int *sever(int *, int, int);
  3. int *sever(int *p, int len, int n){//n是查询数字
  4.         int *q = p+n/2;
  5.         //记录一半位置的指针
  6.         if (n < *q){//待查询值偏小
  7.                 return sever(p, len/2, n);
  8.         }
  9.         else if(n > *q){
  10.                 return sever(q, len/2, n);
  11.         }
  12.         else {
  13.                 return (*q == n)?q:p;
  14.         }
  15. }

  16. int main()
  17. {
  18.         int array[10] = {1,2,3,4,5,6,7,8,9,10};
  19.         //这里我想写成下面这样就可以少定义一个指针
  20.         //int (*q)[10] = {1,2,3,4,5,6,7,8,9,10};
  21.         //对于这个指针我的理解是:q是一个指针、指向一个含有十个int型元素的数组,进行一层解引用跨度应该是一个int吧
  22.         //实验代码 -- 比如我想访问数字2
  23.         //printf("%d ", *q + 1);
  24.         //输出结果是5
  25.         //printf("%d ", *q + 2);
  26.         //输出结果是9
  27.         //综上q指针的一层解引用跨度是4,为什么呢?
  28.         int *p = array;
  29.         int i = 5;
  30.        
  31.         printf("%d", *sever(p, 10, i));
  32.        
  33.         return 0;
  34. }
复制代码


问题已经在代码中间有问题的位置,请求大佬能帮我解答一下这个问题 ,求求了
最佳答案
2021-7-28 19:44:27
  1. //这里我想写成下面这样就可以少定义一个指针
  2. //int (*q)[10] = {1,2,3,4,5,6,7,8,9,10};

  3. 这种写法第一次见,我试了一下,应该写成这样

  4. int (*q)[10] = &(int [10]){1,2,3,4,5,6,7,8,9,10};

  5. 这样写没问题的
  6.    0x0000000100401080 <+0>:     push   %rbp
  7.    0x0000000100401081 <+1>:     mov    %rsp,%rbp
  8.    0x0000000100401084 <+4>:     sub    $0x50,%rsp
  9.    0x0000000100401088 <+8>:     callq  0x100401100 <__main>
  10.    0x000000010040108d <+13>:    movl   $0x1,-0x30(%rbp)
  11.    0x0000000100401094 <+20>:    movl   $0x2,-0x2c(%rbp)
  12.    0x000000010040109b <+27>:    movl   $0x3,-0x28(%rbp)
  13.    0x00000001004010a2 <+34>:    movl   $0x4,-0x24(%rbp)
  14.    0x00000001004010a9 <+41>:    movl   $0x5,-0x20(%rbp)
  15.    0x00000001004010b0 <+48>:    movl   $0x6,-0x1c(%rbp)
  16.    0x00000001004010b7 <+55>:    movl   $0x7,-0x18(%rbp)
  17.    0x00000001004010be <+62>:    movl   $0x8,-0x14(%rbp)
  18.    0x00000001004010c5 <+69>:    movl   $0x9,-0x10(%rbp)
  19.    0x00000001004010cc <+76>:    movl   $0xa,-0xc(%rbp)
  20.    0x00000001004010d3 <+83>:    lea    -0x30(%rbp),%rax
  21.    0x00000001004010d7 <+87>:    mov    %rax,-0x8(%rbp)
  22. => 0x00000001004010db <+91>:    mov    $0x0,%eax
  23.    0x00000001004010e0 <+96>:    add    $0x50,%rsp
  24.    0x00000001004010e4 <+100>:   pop    %rbp
  25.    0x00000001004010e5 <+101>:   retq


  26. int *p = array;
  27. p 指向数组
  28. *p 就是数组
  29. *p 和 array 是等价的

  30. *p + 1 就等于 array + 1
  31. 数组名是数组第 0 个元素的地址
  32. array + 1 就是 &array[0] + 1
  33. 一个 int 类型的地址加 1,什么概念?

  34. int a = 123;
  35. int *p = &a;
  36. p + 1 是什么意思?
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-28 19:44:27 | 显示全部楼层    本楼为最佳答案   
  1. //这里我想写成下面这样就可以少定义一个指针
  2. //int (*q)[10] = {1,2,3,4,5,6,7,8,9,10};

  3. 这种写法第一次见,我试了一下,应该写成这样

  4. int (*q)[10] = &(int [10]){1,2,3,4,5,6,7,8,9,10};

  5. 这样写没问题的
  6.    0x0000000100401080 <+0>:     push   %rbp
  7.    0x0000000100401081 <+1>:     mov    %rsp,%rbp
  8.    0x0000000100401084 <+4>:     sub    $0x50,%rsp
  9.    0x0000000100401088 <+8>:     callq  0x100401100 <__main>
  10.    0x000000010040108d <+13>:    movl   $0x1,-0x30(%rbp)
  11.    0x0000000100401094 <+20>:    movl   $0x2,-0x2c(%rbp)
  12.    0x000000010040109b <+27>:    movl   $0x3,-0x28(%rbp)
  13.    0x00000001004010a2 <+34>:    movl   $0x4,-0x24(%rbp)
  14.    0x00000001004010a9 <+41>:    movl   $0x5,-0x20(%rbp)
  15.    0x00000001004010b0 <+48>:    movl   $0x6,-0x1c(%rbp)
  16.    0x00000001004010b7 <+55>:    movl   $0x7,-0x18(%rbp)
  17.    0x00000001004010be <+62>:    movl   $0x8,-0x14(%rbp)
  18.    0x00000001004010c5 <+69>:    movl   $0x9,-0x10(%rbp)
  19.    0x00000001004010cc <+76>:    movl   $0xa,-0xc(%rbp)
  20.    0x00000001004010d3 <+83>:    lea    -0x30(%rbp),%rax
  21.    0x00000001004010d7 <+87>:    mov    %rax,-0x8(%rbp)
  22. => 0x00000001004010db <+91>:    mov    $0x0,%eax
  23.    0x00000001004010e0 <+96>:    add    $0x50,%rsp
  24.    0x00000001004010e4 <+100>:   pop    %rbp
  25.    0x00000001004010e5 <+101>:   retq


  26. int *p = array;
  27. p 指向数组
  28. *p 就是数组
  29. *p 和 array 是等价的

  30. *p + 1 就等于 array + 1
  31. 数组名是数组第 0 个元素的地址
  32. array + 1 就是 &array[0] + 1
  33. 一个 int 类型的地址加 1,什么概念?

  34. int a = 123;
  35. int *p = &a;
  36. p + 1 是什么意思?
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-28 21:16:56 | 显示全部楼层
指针加整型
增加指向类型 的宽度
int * p
p+1 等于内存地址加4 指向下一个整形的位置
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-28 21:26:58 | 显示全部楼层

谢谢大佬,我悟了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-28 21:27:47 | 显示全部楼层
万千只cnm 发表于 2021-7-28 21:16
指针加整型
增加指向类型 的宽度
int * p

谢谢大佬,我悟了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-28 21:39:28 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2021-7-29 11:07:21 From FishC Mobile | 显示全部楼层
万千只cnm 发表于 2021-7-28 21:39
能给个最佳嘛

最佳答案,还能给多个吗?这个我不清楚诶,我看上面那个大哥解答的也挺好的,然后也看得懂我就给他设为最佳了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-29 14:44:47 | 显示全部楼层
卢本伟牛逼 发表于 2021-7-29 11:07
最佳答案,还能给多个吗?这个我不清楚诶,我看上面那个大哥解答的也挺好的,然后也看得懂我就给他设为最 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 05:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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