首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

函数之间二维数组多种表示方法的传递有关问题

2014-01-22 
函数之间二维数组多种表示方法的传递问题被搞的有点迷糊。。。。代码1#include stdio.h#define ROWS 2#defin

函数之间二维数组多种表示方法的传递问题
被搞的有点迷糊。。。。
代码1


#include <stdio.h>
#define ROWS 2
#define COLS 100
void print_alldata(char *szdata[], int rows);
int main(void )
{
    char szdata[ROWS][COLS]={
        "this is the first line!",
        "this is the second line!"

    };
    print_alldata(szdata, ROWS);

    return 0;
}

void print_alldata(char *szdata[], int rows)
{
    for(int i = 0; i < rows; ++i)
        puts(szdata[i]);
}


代码2

#include <stdio.h>
#define ROWS 2
#define COLS 100
void print_alldata(char *szdata[], int rows);
int main(void )
{
    char *szdata[ROWS]={
        "this is the first line!",
        "this is the second line!"

    };
    print_alldata(szdata, ROWS);

    return 0;
}

void print_alldata(char *szdata[], int rows)
{
    for(int i = 0; i < rows; ++i)
        puts(szdata[i]);
}


代码3

#include <stdio.h>
#define ROWS 2
#define COLS 100
void print_alldata(char szdata[][COLS], int rows);
int main(void )
{
    char szdata[ROWS][COLS]={
        "this is the first line!",
        "this is the second line!"

    };
    print_alldata(szdata, ROWS);

    return 0;
}

void print_alldata(char szdata[][COLS], int rows)
{
    for(int i = 0; i < rows; ++i)
        puts(szdata[i]);
}


代码4

#include <stdio.h>
#define ROWS 2
#define COLS 25
void print_alldata(char *szdata, int );
int main(void )
{
    char szdata[ROWS][COLS]=
{
    {"this is the first line!\n"},
        {"this is the second line!\n"}
};
    print_alldata(szdata,50);

    return 0;
}

void print_alldata(char *szdata, int rows)
{
int i;
    for(i = 0; i < rows; ++i)
        printf("%c",szdata[i]);
}


代码1运行有问题,其他都可以,代码4是用一级指针处理二维数组。
-----------------------------------------
问题如下:
1、代码1和代码2的区别就有一个地方,为啥szdata[ROWS][COLS]改为*szdata[ROWS]之后就能运行了?
2、代码4中char szdata[ROWS][COLS];定义完成之后szdata是指向COLS个元素的数组,而void print_alldata(char *szdata, int rows)这里面的szdata却只是指向了一个字符,指向大小不一样的指针也能传递吗?

理解得不太顺利,想让高人帮忙下详细分析下,谢谢了。
[解决办法]
C/C++的"二维数组"其实是数组的数组,搞懂了一维数组,你的问题就会变简单.


[解决办法]
字符串不能象数组一样初始化
[解决办法]
引用:
Quote: 引用:

本质都是一个地址,只不过是类型不一样。
用的时候强转啥问题都能解决。。。。哈哈哈~
看了下楼主对指针数组跟数组指针的概念不是很清楚。
顺便再说一句,当数组名作为函数形参的时候,会退化为指针。
我知道,难点不在这。。。你看看我17L说的。

嗯嗯,我看了下.
你把二维数组也就是 存有两个字符串的地址赋值给了 指针数组了,而指针数组中存放的都是指针,这道题目中指针数组szdata使用了两个指针,也就是元素0和1,他们分别指向自己的区域,相当于两个独立的指针,0肯定不会出错,因为szdata[0]是指向了二维数组的首地址了,而szdata[1]是指向了哪里呢?指向了一个未知区域。属于未定义的行为。你要使用szdata[1]来输出,也就是读取你没有权限的内存肯定会段错误。其实这个行为本来就是不可取的,因为不兼容的类型间赋值本身就容易出问题。
[解决办法]

using namespace std;

int main()
{
    char test[2][10] = {"test", "other"};


    cout << sizeof(test) << endl; //20
    cout << sizeof(test[0]) << endl; //10
    cout << sizeof(test[1]) << endl; //10
}


所谓二维数组,其实本质上还是1维数组。只不过是多个一维数组拼起来
 

热点排行