| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 438 人关注过本帖
标题:函数之间二维数组多种表示方法的传递问题
只看楼主 加入收藏
xiaopo
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2010-7-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
函数之间二维数组多种表示方法的传递问题
被搞的有点迷糊。。。。

代码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却只是指向了一个字符,指向大小不一样的指针也能传递吗?

理解得不太顺利,想让高人帮忙下详细分析下,谢谢了。

PS:我是这么想的,
szdata[ROWS][COLS](这个szdata本质上是数组指针)和*szdata[ROWS](szdata是指向字符的指针的指针)。指针指向大小不一样以为不可以传递,但是出现代码4之后我凌乱了,那个是szdata[ROWS][COLS](这个szdata本质上是数组指针)传递给char *szdata它啊,这明显不一样,但是还是可以运行。
2014-01-19 20:12
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:20 
二维数组转化一维数组是需要公式的

DO IT YOURSELF !
2014-01-19 20:28
xiaopo
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2010-7-17
收藏
得分:0 
回复 2楼 wp231957
朋友你好,谢谢你先,不过。。。能详细说下吗
2014-01-19 20:30
xiaopo
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2010-7-17
收藏
得分:0 
睡觉去了,明天再来。
2014-01-19 20:35
xiaopo
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2010-7-17
收藏
得分:0 
来了,没人讲讲吗?
2014-01-20 09:32
xiaopo
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2010-7-17
收藏
得分:0 
szdata[ROWS][COLS] 传递给char *szdata[]是数组指针传递给指针数组
char *szdata[ROWS]传递给char *szdata[]就正常是因为都是指针数组


char szdata[ROWS][COLS]中,szdata也是一个数组指针,char *szdata[ROWS]中,szdata也是一个指针吧(不管说这个指针是不是数组指针)


二维数组 函数之间 传递实际是传递指针,那么这传过去应该没问题吧(当时这2个程序编译也都没问题,只是运行的时候有问题。)


也就是说在void print_alldata(char *szdata[], int rows)
{
for(int i = 0; i < rows; ++i)
puts(szdata[i]);
}这个函数内部执行的时候,运行有问题了,运行出现了崩溃。




而我如果不对szdata[i]操作的话,运行毫无问题(这是废话),操作了就会出现一个不正常,一个正常的问题。


那么,在char szdata[ROWS][COLS]中,每次执行,szdata[i],也就是*(szdata+1),szdata实际上每次会移动COLS个字符大小吧


那么,在char *szdata[ROWS]中,每次执行,szdata[i],也就是*(szdata+1),szdata实际上每次会移动的大小是不固定的,取决于szdata指向行的字符串长度,比如第一次移动的大小应该就是sizeof("this is the first line!"),这样才能指向第二行。


那么,实际上,我们从本质上面来看,这两个传递过来的指针(你刚刚也说了,我们传递的是指针,而不管这两个指针到底是不是数组指针,反正是指针。),都是没问题的吧?那为啥char szdata[ROWS][COLS]就有问题?而char *szdata[ROWS]没问题呢?我就想知道,这个地方,这是我想知道的,其他关于数组指针和指针数组的区别我知道的。


我是想从传递的实质上来看,但是从语法角度来看,你说的确实没问题,数组指针传递给了指针数组,这不合语法啊,一个指针(数组指针)怎么能传给数组(指针数组)呢,只有指针数组才能传递给指针数组,但是实际传递的不都是指针吗?他真能传递一个数组(指针数组)给数组(指针数组)吗?
2014-01-20 11:02
xiaopo
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2010-7-17
收藏
得分:0 
http://bbs.
此贴终结。
2014-01-20 17:45
快速回复:函数之间二维数组多种表示方法的传递问题
数据加载中...
 
   



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

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