读书人

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

发布时间: 2014-01-22 00:03:39 作者: rapoo

函数之间二维数组多种表示方法的传递问题
被搞的有点迷糊。。。。
代码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维数组。只不过是多个一维数组拼起来
 

读书人网 >C语言

热点推荐