| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8974 人关注过本帖
标题:“char **”与“char [10][30]”的间接级别不同是什么
只看楼主 加入收藏
观海听潮
Rank: 1
等 级:新手上路
帖 子:14
专家分:5
注 册:2016-8-28
结帖率:50%
收藏
已结贴  问题点数:18 回复次数:7 
“char **”与“char [10][30]”的间接级别不同是什么
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
//有一个字符串符合以下特征("abcdef,acccd,eeee,aaaa,e3eeeee,sssss,";),要求写一个函数(接口)
//输出以下结构
//1 以逗号分割字符串, 形成二维数组, 并把结果传出;
//2 把二维数组行数运算结果也传出来

//定义接口
void printStr(char **p, int count)    //打印数组,形参是char **p ,就会显示 “char **”与“char [10][30]”的间接级别不同 这个错误,
{                                               //形参是char p[][30],就不会出错,这是为啥呢?
    int i = 0;
    for(i = 0; i < count; i++)
    {
        printf("%s\n", p[i]);
    }
}

int main()
{
    int i = 0, j = 0;
    int ret = 0;
    int count = 0;
    char *p = "abcdef,acccd,eeee,aaaa,e3eeeee,sssss,";
    char cTem = ',';

    char myArray[10][30] = { 0 };

    //这中间还有一个向这个二维数组中拷贝字符的调用函数,出现的问题和调用打印函数是一样的,可以不用考虑
    printStr(myArray, count);
}
 
搜索更多相关主题的帖子: include 字符串 sssss count 接口 
2016-10-09 21:38
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:4 
使用多级指针指向多维数组时,最高维可以不指定,但除了最高维的低维必须要指定
这样当p+1时才知道要跳过多少空间,指向的下一个空间地址。。。。
2016-10-09 22:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:3 
char [10][30] 是个二维数组,其成员是个一维数组
char *p[] 是个一维数组,其成员可能是个一维数组的地址
2016-10-10 08:40
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:2 
回复 3楼 rjsp
char *p[10];既然是一个数组的话就应该指定大小
而且这个指针数组不能指向一个二维数组
2016-10-10 12:47
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:6 
解决方案一:
程序代码:
void printStr(char p[][30], int count)//多维数组传递至少必须给出除最高维以外所有维的大小
{                   
    int i = 0;
    for(i = 0; i < count; i++)
    {
        printf("%s\n", p[i]);
    }
}

int main()
{
    int i = 0, j = 0;
    int ret = 0;
    int count = 0;
    char *p = "abcdef,acccd,eeee,aaaa,e3eeeee,sssss,";
    char cTem = ',';

    char myArray[10][30] = { 0 };

    printStr(myArray, count);
}
  
-------------
多维数组在内存中是连续存放的。
比如 char p[10][30];  &p[9][29]是紧邻与&a[10][0]的。计算机在处理多维数组的时候a[i][j]的时候其实可以理解为a[i*30+j],先访问数组a的地址,然后向右偏移i*3个char,访问到a[i]行(也是a[i][0]),再向右偏移j个char访问到a[i][j].所以对于程序而言,这个30是他必须要知道的
类似的 int b[10][20][30]需要知道20和30,更多维的也是。






[此贴子已经被作者于2016-10-10 13:08编辑过]


φ(゜▽゜*)♪
2016-10-10 12:55
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:3 
如果你要定义一个指向二维数组的指针,
char (*p)[30];     //大小必须和二维数组的第二维相同
表示一个指向数组的指针,
p+1表示指向第二个字符串
2016-10-10 12:58
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:0 
回复 5楼 书生牛犊
能编译吗???
2016-10-10 13:02
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 7楼 word123
不好意思,已修改

φ(゜▽゜*)♪
2016-10-10 13:08
快速回复:“char **”与“char [10][30]”的间接级别不同是什么
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036270 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved