c语言指针练习和平时训练


设int a,*p=&a;以下哪项表达式不成立?
A、*p==&a
B、*p==*&a
C、(*p)++==a++
D、*(p++)==a++

为什么选A?

A不成立,因为a是int,&a是int ,而p是int,两者不匹配

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7809974
  • 你也可以参考下这篇文章:C语言a求最大值并找出是第几个值
  • 除此之外, 这篇博客: 【扫雷简单版】C语言实现的扫雷简单版不含递归展开中的 a.雷的信息存储 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    char mine[ROWS][COLS] = { 0 };
    char show[ROWS][COLS] = { 0 };
    
    mine棋盘用来布雷存储在内部
    show棋盘用来显示周围累的个数,展示给玩家
    
    #define ROW 9
    #define COL 9
    #define ROWS ROW+2
    #define COLS COL+2
    
    到这里有些人应该会有些疑惑为什么9*9的棋盘数组要
    创建11*11的因为当我们扫雷的时候,当排查边界的坐
    标时计算周围雷的个数会越界造成无法计算出周围雷的
    个数,当数组是11*11的时候则完美解决问题。
    
  • 您还可以看一下 王伟老师的C语言入门到精通课程中的 查询功能小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    对于优化后的问题——了解为什么应该选择选项A,我们需要先了解选项A和其他选项的区别:

    选项A是对两个已排好序的数组进行合并,将合并后的元素从后往前依次插入到第一个数组中,保持第一个数组有序。选项B是利用插入排序对单个已排序的数组进行插入操作,插入新元素后再进行插入排序,保持数组有序。选项C是重新开辟一个数组,利用归并排序的思想将两个已排好序的数组合并。选项D与选项B类似,也是对单个已排序的数组进行插入操作,但是每个元素都需要移动,效率较低。

    根据题目中的要求,选项A是合并两个已排序的数组并保持有序,完全符合题目需求,相较其他选择更为优秀。同时,由于选项A在合并过程中,只需要一个额外的数组用来暂存合并后的数组,不需要额外的空间,因此对空间的要求较低。对于实际应用场景,如果需要对两个已排序的数组进行合并,保持有序,选项A是一个比较好的选择。

    最后给出选项A的完整代码:

    void merge(int A[],int &An,int B[],int Bn) { for(int i=Bn-1; i>=0; i--) { for(int j=An-1; j>=0; j--) { if(B[i]>A[j]) { int q; for(q=An; q>j; q--) { A[q]=A[q-1]; } A[q+1]=B[i]; An++; break; } } } }


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