V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iTvX
V2EX  ›  C

C 语言中的二维数组打印,求指教!

  •  1
     
  •   iTvX · 2020-02-02 12:31:19 +08:00 · 3016 次点击
    这是一个创建于 1538 天前的主题,其中的信息可能已经有所发展或是发生改变。
    char b[2][2][20] = {
    {"nihao","sdf"},
    {"sdfs","dsfsf"}
    };

    printf("%s",b[0][0]);

    打印结果是 nihao

    比如我要打印这个,必须二维数组后面加一个长度[20],我一直没搞清楚为什么一定要这个呀?是不是二维数组打印,一定要三维数组引入才能打印啊,好困惑

    我新学 C,这个我查了 google 没查到,在 Stack Overflow 也问了,但是人家说我问题不够具体,只有跑到 V2EX 来问了

    如果问题我没说清楚的话,我再说一遍,就是我想打印“nihao”,但是直接用二维数组打印不出来,必须在后面加一个[20],为什么呀
    第 1 条附言  ·  2020-02-02 16:18:33 +08:00
    谢谢大家,本帖终结。

    我认为有用的答案,我都发送了感谢❤️。如果有和我一样疑问的朋友,直接看发送了感谢的回复就好。
    18 条回复    2020-02-02 21:44:45 +08:00
    heart4lor
        1
    heart4lor  
       2020-02-02 12:34:57 +08:00   ❤️ 1
    字符串是一个字符数组,就是你所说的第三维
    iTvX
        2
    iTvX  
    OP
       2020-02-02 12:36:34 +08:00
    @heart4lor 就是说,打印字符串,一定要用到三维数组吗?我还是有点困惑
    Cielsky
        3
    Cielsky  
       2020-02-02 12:42:25 +08:00 via Android
    你这样想,一维是一行数据,比如 asdffg
    二维是 m 行 n 列数据,是个矩形
    三维就是个立方体了
    打印字符串一维就够了啊
    iTvX
        4
    iTvX  
    OP
       2020-02-02 12:44:13 +08:00
    @Cielsky 我试了,一维好像不行,只能打 char。。。

    我想问的就是,为什么打印这个“nihao”,后面要加一个 [20] 作为三维数组才能打印呢?

    就是很困惑这个
    fengtons
        5
    fengtons  
       2020-02-02 13:02:56 +08:00 via Android   ❤️ 1
    因为字符串就是一个字符数组,char str[5]="nihao",再结合你想要的思考一下就明白了。
    还有 C 语言多维数组规定最后一维必须要指定长度,所以你要填上[20]
    nameme
        6
    nameme  
       2020-02-02 13:12:00 +08:00
    @fengtons 这么说最后一维长度指定 1 就可以了?
    BingoXuan
        7
    BingoXuan  
       2020-02-02 13:16:44 +08:00
    完全不清楚你这个二维数组最基础的元素类型是什么。如果最基础类型是字符串(数组),那么实际是三维字符数组,二维的字符串数组。所以初始化就是 char b[2][2][20]。而如果是整型,那么就是 int b[2][2]。
    yzwduck
        8
    yzwduck  
       2020-02-02 13:26:19 +08:00   ❤️ 1
    如果要去掉结尾的 [20] 的话,只需要把声明改成 char *b[2][2] = {{"a...", "b..."}, {"c...", "d..."}}。
    如果声明是 char b[2][2][20],可以理解为它是 2x2 个长度固定为 20 字节的字符串,表达式 b[x][y] 实际上也是 b[x][y][0] 的地址;
    反之,如果声明成 char *b[2][2],它是 2x2 个字符串指针,表达式 b[x][y] 是实际存放在这个数组里的一个值。
    iTvX
        9
    iTvX  
    OP
       2020-02-02 13:37:16 +08:00
    @BingoXuan 额 我这类型不是写在里面吗。。

    char b[2][2][20] = {
    {"nihao","sdf"},
    {"sdfs","dsfsf"}
    };
    fengtons
        10
    fengtons  
       2020-02-02 13:37:47 +08:00 via Android
    @nameme 最后一维是字符串的最大长度,比如所有字符串都不超过 10 个字符的话可以填 10
    iTvX
        11
    iTvX  
    OP
       2020-02-02 13:37:53 +08:00
    @fengtons
    @yzwduck

    懂了懂了 谢谢你们!!!
    xiri
        12
    xiri  
       2020-02-02 14:02:21 +08:00
    “nihao”本身就是一个一维数组了,你定义的
    char b[2][2][20] = {
    {"nihao","sdf"},
    {"sdfs","dsfsf"}
    };
    可以理解成每个元素都是一个一维数组的二维数组(实际上就是三维数组)
    iTvX
        13
    iTvX  
    OP
       2020-02-02 14:08:48 +08:00
    @fengtons 还有个小疑问

    “C 语言多维数组规定最后一维必须要指定长度,所以你要填上[20]”

    那它可不可以看成是二维数组加上指定长度呢?所以它到底是不是三维数组呢?
    netstu
        14
    netstu  
       2020-02-02 15:09:21 +08:00
    一楼直接说明白了啊
    Cielsky
        15
    Cielsky  
       2020-02-02 15:10:05 +08:00
    是这样,你需要多看书
    钻牛角尖了
    看到指针,你就知道啥意思了
    mxalbert1996
        16
    mxalbert1996  
       2020-02-02 15:37:52 +08:00 via Android   ❤️ 1
    @iTvX 你这里的字符串类型实际上是 char[],所以字符串类型的二维数组实际上就是 char 类型的三位数组。
    fengtons
        17
    fengtons  
       2020-02-02 17:27:25 +08:00 via Android
    @iTvX C 语言里没有字符串这种类型,字符串就是字符类型的数组,所以具体到你的问题就是个字符类型的三维数组
    MadHouse
        18
    MadHouse  
       2020-02-02 21:44:45 +08:00 via Android
    你搞混了 char 和 string, 所以 c++才加了 string 类型方便开发者使用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   982 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:40 · PVG 06:40 · LAX 15:40 · JFK 18:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.