鱼C论坛

 找回密码
 立即注册
查看: 1379|回复: 16

[已解决]char s[1]与char s的区别

[复制链接]
发表于 2020-4-13 20:15:26 | 显示全部楼层 |阅读模式

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

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

x
我定义了一个字符变量:
char gender[1];
随后通过scanf对其进行赋值,再与另一字符作比较:
if(gender=='M')
但是这时候程序报错,说[Error] ISO C++ forbids comparison between pointer and integer [-fpermissive] ,[错误] ISO C++禁止指针与整数的比较。
但是如果我修改变量的定义,改为:
char gender;
这时候编译通过了,这是为什么呢?
最佳答案
2020-4-13 20:26:28
本帖最后由 yexing 于 2020-4-13 20:41 编辑

在C语言中,所有的数组名都是一个指向该数组第0个元素的指针(如果还没学习,以后就会了解的)
你拿一个指针和一个字符比,它们是两个完全不同类型的变量,当然无法比较。
char str; //是一个字符变量
char str[10]; //是一个长度为10的字符数组变量

如果要修改一个可比较的代码的话,应该是这样:
*涉及指针知识,如果看不懂请跳过,以后学指针就懂了,这里只是给你提供一个可行的方案
*不建议像下面那样做,这里只是按你的思路写一个可行的方案,因为字符数组一般有个表示字符串结尾的'\0'字符,但是这里并没有添加'\0'字符,会引发越界问题
#include <stdio.h>

int main(void)
{
        char gender[1];
        
        scanf("%c", &gender); //因为gender指向第0个元素,所以直接取址没问题
        
        if (*gender == 'M') //'*'是取值符,即取gender指向的内存地址中存放的值 
        {
                printf("相同!\n");
        }
        else
        {
                printf("不同!\n");
        }
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-13 20:16:50 | 显示全部楼层
本帖最后由 qwer_1234 于 2020-4-13 21:03 编辑

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

使用道具 举报

发表于 2020-4-13 20:17:28 | 显示全部楼层
带上中括号就是数组,也就是指针了,不带就是一个普通的char变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 20:18:11 | 显示全部楼层
char gender[1];
是字符数组
char gender;
是字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 20:18:48 | 显示全部楼层
qwer_1234 发表于 2020-4-13 20:16
你的文件要改成.c

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

使用道具 举报

发表于 2020-4-13 20:24:14 | 显示全部楼层

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

使用道具 举报

发表于 2020-4-13 20:26:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 yexing 于 2020-4-13 20:41 编辑

在C语言中,所有的数组名都是一个指向该数组第0个元素的指针(如果还没学习,以后就会了解的)
你拿一个指针和一个字符比,它们是两个完全不同类型的变量,当然无法比较。
char str; //是一个字符变量
char str[10]; //是一个长度为10的字符数组变量

如果要修改一个可比较的代码的话,应该是这样:
*涉及指针知识,如果看不懂请跳过,以后学指针就懂了,这里只是给你提供一个可行的方案
*不建议像下面那样做,这里只是按你的思路写一个可行的方案,因为字符数组一般有个表示字符串结尾的'\0'字符,但是这里并没有添加'\0'字符,会引发越界问题
#include <stdio.h>

int main(void)
{
        char gender[1];
        
        scanf("%c", &gender); //因为gender指向第0个元素,所以直接取址没问题
        
        if (*gender == 'M') //'*'是取值符,即取gender指向的内存地址中存放的值 
        {
                printf("相同!\n");
        }
        else
        {
                printf("不同!\n");
        }
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 20:28:14 | 显示全部楼层

那也比你的无稽之谈强
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-13 20:33:39 | 显示全部楼层
yexing 发表于 2020-4-13 20:26
在C语言中,所有的数组名都是一个指向该数组第1个元素的指针(如果还没学习,以后就会了解的)
你拿一个指 ...

纠正一下,是第 0 个元素
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 20:35:44 | 显示全部楼层
人造人 发表于 2020-4-13 20:33
纠正一下,是第 0 个元素
^_^


说成第1个元素比较容易理解^_^
不过严谨一点还是第0个元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 20:48:55 | 显示全部楼层
#7 楼给出了定义
只需要解引用就好了!
#include <stdio.h>
int main(void)
{
        char gender[1]="M"; 
        if (*gender == 'M') printf("Equal!");
        if (gender[0] == 'M') printf("Equal!");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-13 20:55:45 | 显示全部楼层

五十步笑百步呢?我也有点文化的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 21:03:00 | 显示全部楼层
qwer_1234 发表于 2020-4-13 20:55
五十步笑百步呢?我也有点文化的

应该是五百步笑十步吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-13 21:04:11 | 显示全部楼层
如果我定义的是char s[1]
如果不用指针的话,用 char[0]来进行比较好像也可以,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 21:05:12 | 显示全部楼层
何必呢?大家都是爱好这个呢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-13 21:10:47 | 显示全部楼层
yexing 发表于 2020-4-13 20:26
在C语言中,所有的数组名都是一个指向该数组第0个元素的指针(如果还没学习,以后就会了解的)
你拿一个指 ...

如果我定义的是char s[1]
如果不用指针的话,用 char[0]来进行比较好像也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-13 21:25:20 | 显示全部楼层
茶叶仓鼠 发表于 2020-4-13 21:10
如果我定义的是char s[1]
如果不用指针的话,用 char[0]来进行比较好像也可以

是的,这样子也没错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 06:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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