函数之间二维数组多种表示方法的传递有关问题
函数之间二维数组多种表示方法的传递问题
被搞的有点迷糊。。。。
代码1
代码2
代码3
代码4
代码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++的"二维数组"其实是数组的数组,搞懂了一维数组,你的问题就会变简单.
------解决方案--------------------
字符串不能象数组一样初始化
------解决方案--------------------
嗯嗯,我看了下.
你把二维数组也就是 存有两个字符串的地址赋值给了 指针数组了,而指针数组中存放的都是指针,这道题目中指针数组szdata使用了两个指针,也就是元素0和1,他们分别指向自己的区域,相当于两个独立的指针,0肯定不会出错,因为szdata[0]是指向了二维数组的首地址了,而szdata[1]是指向了哪里呢?指向了一个未知区域。属于未定义的行为。你要使用szdata[1]来输出,也就是读取你没有权限的内存肯定会段错误。其实这个行为本来就是不可取的,因为不兼容的类型间赋值本身就容易出问题。
------解决方案--------------------
被搞的有点迷糊。。。。
代码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++的"二维数组"其实是数组的数组,搞懂了一维数组,你的问题就会变简单.
------解决方案--------------------
字符串不能象数组一样初始化
------解决方案--------------------
嗯嗯,我看了下.
你把二维数组也就是 存有两个字符串的地址赋值给了 指针数组了,而指针数组中存放的都是指针,这道题目中指针数组szdata使用了两个指针,也就是元素0和1,他们分别指向自己的区域,相当于两个独立的指针,0肯定不会出错,因为szdata[0]是指向了二维数组的首地址了,而szdata[1]是指向了哪里呢?指向了一个未知区域。属于未定义的行为。你要使用szdata[1]来输出,也就是读取你没有权限的内存肯定会段错误。其实这个行为本来就是不可取的,因为不兼容的类型间赋值本身就容易出问题。
------解决方案--------------------
using namespace std;
int main()
{
char test[2][10] = {"test", "other"};