鱼C论坛

 找回密码
 立即注册
查看: 720|回复: 11

[已解决]左值问题

[复制链接]
发表于 2023-11-24 20:55:05 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. void search(int (*p)[10]);

  5. int main(){
  6.     int a[10];
  7.     for(int i=0; i<10; i++){
  8.         scanf("%d",&a[i]);
  9.     }
  10.     int (*p)[10]=a;
  11.     search(p);
  12. }

  13. void search(int (*p)[10]){
  14.     int count_max=0,count_min=0;
  15.     for(int i=1; i<10; i++){
  16.         if(p[i]>p[count_max]) count_max=i;
  17.         if(p[i]<p[count_min]) count_min=i;
  18.     }
  19.     int num=0;
  20.     num = p[count_max];
  21.     p[count_max]=p[9];
  22.     p[19]=p[count_max];
  23. }
复制代码



问题描述:输入十个数,将最小的和第一个数交换,最大的和最后一个数交换。

求助:最后p[count_max]和p[9]报错不可修改左值
最佳答案
2023-11-24 21:06:29
伴学终生 发表于 2023-11-24 21:04
改成这样后程序报错,请问问题出在哪

赋值的地方需要改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-24 20:55:41 | 显示全部楼层
左值是能够放在赋值号(=)左边的表达式或变量。在C语言中,左值必须是可修改的。

在你的代码中,search函数的参数是一个指向整型数组的指针。这意味着search函数会接收一个整型数组的地址,并通过指针来操作数组的元素。

在main函数中,你定义了一个整型变量a,然后你尝试将整型变量a的地址传递给search函数进行操作。但是由于整型变量是一个右值,它的地址不能直接进行修改。因此,编译器会报错。

如果你想要传递一个可以修改的左值给search函数,你可以创建一个整型数组,然后将整型数组的地址传递给search函数。

以下是一个可行的示例代码:

#include
#include
#include

void search(int (*p));

int main(){
    int arr[5] = {1, 2, 3, 4, 5};
    search(arr);
   
    return 0;
}

void search(int (*p)){
    for(int i=0; i<5; i++){
        printf("%d\n", p);
    }
}

在这个示例中,我们创建了一个名为arr的整型数组,并将它的地址传递给search函数。在search函数中,我们使用指针p来遍历整型数组并打印出每个元素的值。

希望这个解答对你有帮助!如果你还有其他问题,请随时提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-24 21:04:40 | 显示全部楼层
FishC_GPT 发表于 2023-11-24 20:55
左值是能够放在赋值号(=)左边的表达式或变量。在C语言中,左值必须是可修改的。

在你的代码中,search函 ...
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. void search(int (*p));

  5. int main(){
  6.     int a[10];
  7.     for(int i=0; i<10; i++){
  8.         scanf("%d",&a[i]);
  9.     }
  10.     int (*p)[10]=&a;
  11.     search(p);
  12. }

  13. void search(int (*p)){
  14.     int count_max=0,count_min=0;
  15.     for(int i=1; i<10; i++){
  16.         if(p[i]>p[count_max]) count_max=i;
  17.         if(p[i]<p[count_min]) count_min=i;
  18.     }
  19.     int num=0;
  20.     num = p[count_max];
  21.     p[count_max]=p[9];
  22.     p[9]=num;
  23.     num = p[count_min];
  24.     p[count_min]=p[0];
  25.     p[0]=num;
  26. }
复制代码


改成这样后程序报错,请问问题出在哪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 21:05:25 | 显示全部楼层
伴学终生 发表于 2023-11-24 21:04
#include
#include
#include

void search(int ...

抱歉,之前的回答出现了错误。首先,请确保你的代码格式正确并且完整。在你提供的代码中,缺少了两个右大括号(}),其中一个应该放在search函数的最后,另一个应该放在main函数的最后。此外,你的代码中存在两个问题:

1. 参数传递问题:
   search函数的参数声明为int (*p),这意味着它接收指向整型的指针。但在调用search函数时,你直接传递了一个整型变量a的地址。更改search函数的参数声明为int *p,即只需接收一个整型指针即可,而无需通过指针类型来指定长度([])。

2. 函数定义问题:
   在调用search函数之前,应先在代码中定义search函数的实现。你可以在main函数之后添加search函数的定义。

以下是经过修正的示例代码:
  1. #include <stdio.h>
  2. void search(int *p);
  3. int main() {
  4.     int a;
  5.     int arr[] = {1, 2, 3, 4, 5};
  6.    
  7.     search(arr);
  8.    
  9.     return 0;
  10. }
  11. void search(int *p) {
  12.     for(int i=0; i<5; i++){
  13.         printf("%d ", p[i]);
  14.     }
  15. }
复制代码

在这个示例代码中,我们将search函数的参数修改为int *p,并在main函数中定义了一个整型数组arr。然后,我们调用search函数,并将整型数组的地址arr作为参数传递给search函数。在search函数中,我们通过循环访问数组元素,并打印出它们的值。

希望这次的回答能够解决你的问题。如果还有其他疑问,请随时提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 21:05:50 | 显示全部楼层
把 (*p)[10] 都替换成 *p 就行了,p 本身即可表示指针的意思, (*p)[10] 是一个 指针数组
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. void search(int *p);

  5. int main(){
  6.     int a[10];
  7.     for(int i=0; i<10; i++){
  8.         scanf("%d",&a[i]);
  9.     }
  10.     int *p=a;
  11.     search(p);
  12.     for(int i=0; i<10; ++i) {
  13.             printf("%d ", a[i]);
  14.         }
  15. }

  16. void search(int *p){
  17.     int count_max=0,count_min=0;
  18.     for(int i=1; i<10; i++){
  19.         if(p[i]>p[count_max]) count_max=i;
  20.         if(p[i]<p[count_min]) count_min=i;
  21.     }
  22.     int num=0;
  23.     num = p[count_max];
  24.     p[count_max]=p[9];
  25.     p[9]=num;
  26. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 21:06:29 | 显示全部楼层    本楼为最佳答案   
伴学终生 发表于 2023-11-24 21:04
改成这样后程序报错,请问问题出在哪

赋值的地方需要改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 21:07:46 | 显示全部楼层
tommyyu 发表于 2023-11-24 21:06
赋值的地方需要改

我有一个 好主意,可以回答所有问题,那就是:

自己想
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-24 21:08:15 | 显示全部楼层
FishC_GPT 发表于 2023-11-24 21:05
抱歉,之前的回答出现了错误。首先,请确保你的代码格式正确并且完整。在你提供的代码中,缺少了两个右大 ...

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void search(int *p);

int main(){
    int a[10];
    for(int i=0; i<10; i++){
        scanf("%d",&a);
    }
    int (*p)[10]=&a;
    search(p);
}

void search(int *p){
    int count_max=0,count_min=0;
    for(int i=1; i<10; i++){
        if(p>p[count_max]) count_max=i;
        if(p<p[count_min]) count_min=i;
    }
    int num=0;
    num = p[count_max];
    p[count_max]=p[9];
    p[9]=num;
    num = p[count_min];
    p[count_min]=p[0];
    p[0]=num;
}


改成这样是否正确?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 21:08:46 | 显示全部楼层
伴学终生 发表于 2023-11-24 21:08
#include
#include
#include

void search(int ...

对不起,之前的回答中仍然存在错误。以下是修正后的完整代码:
  1. #include <stdio.h>
  2. void search(int *p);
  3. int main() {
  4.     int a;
  5.     int arr[] = {1, 2, 3, 4, 5};
  6.    
  7.     search(arr);
  8.    
  9.     return 0;
  10. }
  11. void search(int *p) {
  12.     for(int i=0; i<5; i++) {
  13.         printf("%d ", p[i]);
  14.     }
  15. }
复制代码

在这个例子中,我们声明了search函数接受一个整型指针p作为参数,并在main函数中定义了一个整型数组arr。然后,我们将arr的地址传递给search函数进行操作。search函数中的循环遍历整型数组并打印出每个元素的值。

请注意,在search函数内部,我们使用了指针p来访问整型数组的元素。通过使用指针,我们可以对整型数组进行修改而不是简单地读取其中的值。在这个例子中,我们只是打印了数组的值,但你可以根据需要在search函数中执行其他操作。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 21:09:53 | 显示全部楼层
sfqxx 发表于 2023-11-24 21:07
我有一个 好主意,可以回答所有问题,那就是:

自己想

我想到了一个好主意,找之前的求助帖,然后人工回答,然后举报,说 “x楼是最佳”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-24 21:13:56 | 显示全部楼层
tommyyu 发表于 2023-11-24 21:06
赋值的地方需要改

谢谢你,我改好了,我以为数组作为函数参数需要传数组指针,没想到传个数组名就行了,以下是我修改后的代码!

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. void search(int *p);

  5. int main(){
  6.     int a[10];
  7.     for(int i=0; i<10; i++){
  8.         scanf("%d",&a[i]);
  9.     }
  10.     search(a);
  11.     for(int i=0; i<10; i++){
  12.         printf("%d ",a[i]);
  13.     }
  14. }

  15. void search(int *p){
  16.     int count_max=0,count_min=0;
  17.     for(int i=1; i<10; i++){
  18.         if(p[i]>p[count_max]) count_max=i;
  19.         if(p[i]<p[count_min]) count_min=i;
  20.     }
  21.     int num=0;
  22.     num = p[count_max];
  23.     p[count_max]=p[9];
  24.     p[9]=num;
  25.     num = p[count_min];
  26.     p[count_min]=p[0];
  27.     p[0]=num;
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 21:26:20 | 显示全部楼层
tommyyu 发表于 2023-11-24 21:09
我想到了一个好主意,找之前的求助帖,然后人工回答,然后举报,说 “x楼是最佳”

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 02:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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