鱼C论坛

 找回密码
 立即注册
查看: 1109|回复: 8

[已解决]各位大佬,请教个问题

[复制链接]
发表于 2021-12-24 16:35:03 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. #include<string.h>
  3. #define MAX 5
  4. int main()
  5. {
  6.     int slogan[MAX][100];
  7.     int i,j,text,min,max,temp;
  8.    
  9.     for(i=0;i<MAX;i++)
  10.     {
  11.         printf("输入第%d句话:",i+1);
  12.         for(j=0;(text=getchar())!='\n';j++)
  13.         {
  14.             slogan[i][j]=text;
  15.         }
  16.         slogan[i][j]='\0';
  17.     }

  18.     min=0;
  19.     max=0;
  20.     printf("你输入了下面%d句话:\n",MAX);
  21.     for(i=0;i<MAX;i++)
  22.     {
  23.         printf("%s\n",slogan[i]);
  24.         temp = strlen(slogan[i]);
  25.         min=temp<strlen(slogan[min])?i:min;
  26.         max=temp>strlen(slogan[max])?i:max;
  27.     }
  28.     printf("其中最长的是:%s\n",slogan[max]);
  29.     printf("其中最短的是:%s\n",slogan[min]);
  30. }
复制代码

我的编译器会报[Note] expected 'const char *' but argument is of type 'int *'
为什么他输入得到字符串是只读的,为什么不能用int ,int 不是比char宽吗?
我的所有代码char,我全用的int,也没问题啊!
最佳答案
2021-12-24 16:50:02
本帖最后由 jackz007 于 2021-12-24 17:10 编辑

         char 在有的时候确实可以被当作 int 用,但并不意味着 int 也可以被当作 char 来用。在这里可以下一个断言,int 在任何情况下都绝不可以被当作 char 来使用,尤其是字符串!
         字符串 "ABC" 在内存中是 0x41,0x42,0x43,0x00 ,一共占用 4 个字节,如果是 int,那么,"ABC" 将是 0x41,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,x000,一共占用 16 个字节,这一切都是因为每个 int 占用的是 4 个字节,而 char 是 1 个。问题还不只是 int 占用内存多,操作系统在处理字符串时,是通过检测字符串末尾的 0x00 来判定字符串结束的,这个 int 型的字符串,在操作系统看来,就是一个单字符的字符串 "A",因为,0x41 的后面不止有 1 个,事实上是 3 个 0x00。如此看来,是不是就乱套了?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-12-24 16:50:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-12-24 17:10 编辑

         char 在有的时候确实可以被当作 int 用,但并不意味着 int 也可以被当作 char 来用。在这里可以下一个断言,int 在任何情况下都绝不可以被当作 char 来使用,尤其是字符串!
         字符串 "ABC" 在内存中是 0x41,0x42,0x43,0x00 ,一共占用 4 个字节,如果是 int,那么,"ABC" 将是 0x41,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,x000,一共占用 16 个字节,这一切都是因为每个 int 占用的是 4 个字节,而 char 是 1 个。问题还不只是 int 占用内存多,操作系统在处理字符串时,是通过检测字符串末尾的 0x00 来判定字符串结束的,这个 int 型的字符串,在操作系统看来,就是一个单字符的字符串 "A",因为,0x41 的后面不止有 1 个,事实上是 3 个 0x00。如此看来,是不是就乱套了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 16:53:58 | 显示全部楼层
slogan[MAX][100]应该定义成char类型吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-24 17:26:22 | 显示全部楼层
jackz007 发表于 2021-12-24 16:50
char 在有的时候确实可以被当作 int 用,但并不意味着 int 也可以被当作 char 来用。在这里可以下 ...

大佬,我想直到是不是所有的字符串在内存中都是只读的?
为什么指针不能修改,而数组可以
不是知道了地址就可以修改数据吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 17:31:55 | 显示全部楼层
本帖最后由 jackz007 于 2021-12-24 17:33 编辑
basketmn 发表于 2021-12-24 17:26
大佬,我想直到是不是所有的字符串在内存中都是只读的?
为什么指针不能修改,而数组可以
不是知道了地 ...


         谁说的指针不能修改内存?数组名称的本质其实就是一个常量指针,除了指针数值不能修改外,指针和数组名在使用方法上再没有其他差别。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-24 17:46:00 | 显示全部楼层
jackz007 发表于 2021-12-24 17:31
谁说的指针不能修改内存?数组名称的本质其实就是一个常量指针,除了指针数值不能修改外,指 ...

还有大佬,我想问下,为什么int A不是从低位开始存储,0x00,0x00,0x00,0x41
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 17:47:35 | 显示全部楼层
basketmn 发表于 2021-12-24 17:46
还有大佬,我想问下,为什么int A不是从低位开始存储,0x00,0x00,0x00,0x41

         只需要知道有这么件事就好了,没有那么多为什么,这个世界不是每一件事都需要知道答案的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-24 17:57:14 | 显示全部楼层
jackz007 发表于 2021-12-24 17:47
只需要知道有这么件事就好了,没有那么多为什么,这个世界不是每一件事都需要知道答案的。

好吧,感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-24 18:10:11 | 显示全部楼层
basketmn 发表于 2021-12-24 17:46
还有大佬,我想问下,为什么int A不是从低位开始存储,0x00,0x00,0x00,0x41

看这个
https://fishc.com.cn/forum.php?m ... peid%26typeid%3D571
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 02:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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