指针和数组的关系问题

img


能具体分析一下24页吗,输出结果y=5是不是因为++在打印后再执行,两个结果都不是很明白,能不能带我走一遍全程

先输出的是p,然后才p++,所以说输出的就是数组从下标0开始的。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7683384
  • 你也可以参考下这篇文章:求两组整数的交集 【问题描述】 读入两组整数(每组不超过20个整数,并且同一组中的整数各不相同),编程求两组整数的交集,即在两组整数中都出现的整数,并按从大到小的顺序输出。若交集为空,则什么都不输
  • 除此之外, 这篇博客: 【算法总结】快速排序及边界问题分析中的 细节一:指针移动的判断不带等号 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    考虑一个边界问题,为什么移动ij指针的条件是q[i] < xq[j] > x,而不是q[i] <= xq[j] >= x

    原因如下

    • 如果选取的x是数组里最大的数,序列中所有的数都满足q[i] <= x,会导致i会一直++发生越界都不会停下来。
    • 如果选取的x是数组里最小的数,同理q[j] >= x恒成立,j会一直--发生越界。

    这也是造成快排不稳定的原因,排序算法是否稳定,与时间效率是否稳定无关。稳定是指若源序列中两个值相同的数,排序后这两个数的先后次序不会发生改变。

    而快排中当边界点存在重复的数会交换位置。因此快排不稳定。

    解决不稳定的方法:把序列中的数改成二元数,Ai改成 <Ai, i>,从而使所有的数都不相同。

  • 您还可以看一下 徐传林老师的基于云原生架构构建亿级多语言电商平台设计到落地实现(开发+测试+部署)课程中的 46、商品服务之表设计和构建小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    对于第24页的代码,需要先了解指针和数组的概念。

    指针是一个变量,其值为另一个变量的地址。指针的声明方式为 *type name,其中,type为指针所指向的变量类型,name为指针的名称。

    数组是一组相关类型的变量集合。数组的声明方式为 type name[size],其中,type为数组元素类型,name为数组名称,size为数组的大小。

    现在我们来看一下参考资料中的代码:

    int a[5]={1,2,3,4,5};
    int *p=a;
    printf("%d\n",*p++);
    printf("%d\n",(*p)++);
    printf("%d\n",*++p);
    

    根据代码,我们可以执行以下步骤:

    1. 声明一个包含5个元素的整型数组a,并初始化为 {1,2,3,4,5}。
    2. 声明一个整型指针p,并将其初始化为a的首地址。
    3. 执行第一条输出语句,输出*p的值,即a[0]=1,同时执行p++,将p指向a[1]。
    4. 执行第二条输出语句,输出(p)的值,即a[1]=2,并执行(p)++,将a[1]的值增加1。
    5. 执行第三条输出语句,执行++p,将p指向a[3],输出*p的值,即a[3]=4。

    因此,输出结果为:

    1
    2
    4
    

    由此可见,输出结果不是因为++在打印后才执行了。而是因为指针在移动之后,对数组元素的访问发生了变化。在第二个输出语句中,执行(*p)++后,a[1]的值已经增加了1,所以第三个输出语句中,输出的是a[3]的值。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^