卢本伟牛逼 发表于 2021-7-28 19:27:27

【求助】关于数组指针跨度问题

#include <stdio.h>
int *sever(int *, int, int);
int *sever(int *p, int len, int n){//n是查询数字
        int *q = p+n/2;
        //记录一半位置的指针
        if (n < *q){//待查询值偏小
                return sever(p, len/2, n);
        }
        else if(n > *q){
                return sever(q, len/2, n);
        }
        else {
                return (*q == n)?q:p;
        }
}

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

问题已经在代码中间有问题的位置,请求大佬能帮我解答一下这个问题{:10_250:} ,求求了{:10_338:}

人造人 发表于 2021-7-28 19:44:27

//这里我想写成下面这样就可以少定义一个指针
//int (*q) = {1,2,3,4,5,6,7,8,9,10};

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

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

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


int *p = array;
p 指向数组
*p 就是数组
*p 和 array 是等价的

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

int a = 123;
int *p = &a;
p + 1 是什么意思?

万千只cnm 发表于 2021-7-28 21:16:56

指针加整型
增加指向类型 的宽度
int * p
p+1 等于内存地址加4 指向下一个整形的位置

卢本伟牛逼 发表于 2021-7-28 21:26:58

人造人 发表于 2021-7-28 19:44


谢谢大佬,我悟了{:10_288:}

卢本伟牛逼 发表于 2021-7-28 21:27:47

万千只cnm 发表于 2021-7-28 21:16
指针加整型
增加指向类型 的宽度
int * p


谢谢大佬,我悟了{:5_92:}

万千只cnm 发表于 2021-7-28 21:39:28

卢本伟牛逼 发表于 2021-7-28 21:27
谢谢大佬,我悟了

能给个最佳嘛{:5_102:}

卢本伟牛逼 发表于 2021-7-29 11:07:21

万千只cnm 发表于 2021-7-28 21:39
能给个最佳嘛

最佳答案,还能给多个吗?这个我不清楚诶,我看上面那个大哥解答的也挺好的,然后也看得懂我就给他设为最佳了。{:10_257:}

万千只cnm 发表于 2021-7-29 14:44:47

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

okok
页: [1]
查看完整版本: 【求助】关于数组指针跨度问题