鱼C论坛

 找回密码
 立即注册
查看: 2350|回复: 4

一道二维数组元素引用的问题

[复制链接]
发表于 2016-8-6 15:26:43 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 百变kelvin 于 2016-8-7 14:17 编辑
  1. #include<stdio.h>
  2. void main()
  3. {
  4.         char a[5][10] = {"one", "two", "three", "four", "five"};
  5.         int i, j;
  6.         char t;
  7.         for(i=0; i<2; i++)
  8.         for(j=i+1; j<5; j++)
  9.         if(a[i][0] > a[j][0])
  10.         {
  11.                 t = a[i][0];
  12.                 a[i][0] = a[j][0];
  13.                 a[j][0] = t;
  14.         }
  15.         puts( a[1] );
  16. }
复制代码


程序的输出结果是 fwo

两个不理解

一是像这种给出字符串的二维数组,如a[0][0]这种是对应哪个字符串或者说对应哪个字符串的字母?

二是它要输出的是a[1],这是什么意思呢,怎么就得到fwo了?

还请大家多多指导一下,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-6 17:29:59 | 显示全部楼层
本帖最后由 廿文廿武 于 2016-8-6 17:32 编辑

楼主用的什么IDE,神了,你一步一步的调试就知道是什么回事了,前面的FOR循环只是把数组里的元素改来改去,循环结束后a[1]被改成fwo了,当然是输出这个结果了。

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char a[5][10] = { "one","two", "three", "four", "five" };
  5.         int i, j;
  6.         char t;
  7.         for (i = 0; i<2; i++)
  8.         {
  9.                 for (j = i + 1; j<5; j++)
  10.                 {
  11.                         if (a[i][0] > a[j][0])
  12.                         {
  13.                                 t = a[i][0];
  14.                                 a[i][0] = a[j][0];
  15.                                 a[j][0] = t;
  16.                         }
  17.                 }                       
  18.         }
  19.         puts(a[1]);
  20.         return 0;
  21. }
复制代码


一是像这种给出字符串的二维数组,如a[0][0]这种是对应哪个字符串或者说对应哪个字符串的字母?
a[0][0] = 'o'    a[1][1] = 'w'  a[4][1] = 'i'

二是它要输出的是a[1],这是什么意思呢,怎么就得到fwo了?
a[1]会输出fwo上面说过了,如果没循环之前的结果就是

a[0] = "one"
a[1] = "two"
a[2] = "three"
a[3] = "four"
a[4] = "five"
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-8-6 18:19:20 | 显示全部楼层
楼主基础不行啊、
楼上讲了主要的问题我补充一点细节、
1、数组名就代表数组首地址、
2、对于puts函数来说、当输出是一个字符串遇到'\0'标志才结束、
所以给puts函数传入一个字符串首地址参数、就会连续往后读到'\0'输出才结束、
同理、你也可以不传入首地址、一个字符串中间地址、那就输出后面半截字符串、
我还是提供一个例子把:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char a[5][10] = { "one","two", "three", "four", "five" };
  5.         int i, j;
  6.         char t;
  7.         for (i = 0; i<2; i++)
  8.         {
  9.                 for (j = i + 1; j<5; j++)
  10.                 {
  11.                         if (a[i][0] > a[j][0])
  12.                         {
  13.                                 t = a[i][0];
  14.                                 a[i][0] = a[j][0];
  15.                                 a[j][0] = t;
  16.                         }
  17.                 }
  18.         }
  19.         puts(&a[1][1]);
  20.         return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-7 13:45:16 | 显示全部楼层
廿文廿武 发表于 2016-8-6 17:29
楼主用的什么IDE,神了,你一步一步的调试就知道是什么回事了,前面的FOR循环只是把数组里的元素改来改去, ...

没,这段代码不完全,只是给出了主要代码,是一道题目来着,谢谢你的指导。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-7 13:46:37 | 显示全部楼层
lx_Zz 发表于 2016-8-6 18:19
楼主基础不行啊、
楼上讲了主要的问题我补充一点细节、
1、数组名就代表数组首地址、

是啊,基础不太好,C语言也是最近才开始学,所以遇到很多问题。谢谢你的指导。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-13 21:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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