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

char *a[10]与char a[][10]有什么区别?解决方案

2012-03-27 
char *a[10]与char a[][10]有什么区别????????前几天在这里看到一个程序,我自己试了一下发现了一个问题~~~

char *a[10]与char a[][10]有什么区别????????
前几天在这里看到一个程序,我自己试了一下发现了一个问题~~~
忘记出处了我也懒得去再找具体刚开始是谁问的了,嘿嘿。
具体的问题就是下边的程序在main()中定义char   *a[10]会出问题
不过char   a[][10]就不会有问题,说得再清楚点就是跟入到第四步的时候开始出问题。
小弟才疏学浅,希望懂汇编的高手能告诉我这两种定义到底有什么区别。

我自己找到了一点区别,不过不能解释程序出现的问题。
*a[10]是声明有10个数组(我觉得写成a[10]*更容易理解它的意思,不过这样编译不会通过,嘿嘿);
a[][10]是声明每个数组有10个元素

ps:我用的是vc++6.0,两种情况都可以可以编译成功,但char   *a[10]运行的时候会出错。
用Borland   C++   5.5.1,也可以编译成功,char   *a[10]的运行结果是:
before   sort:
Fortran   Basic   pascal   C   C++  

不知道为什么连 "after   sort: "都没有

最后想再说点嘿嘿,小弟是c++初学者,有很多东西都不会,在cdsn总是问问题,因为学艺不精,论坛上的很多
问题都回答不了,所以呢都是出分,而赚不到分。再所以呢现在cdsn币比较少,高手不要因为我出的分少而不
给回答我的问题啊~~,嘿嘿     ^-^   谢谢了


#include   <iostream.h>
#include <string.h>

void   strcp(char   *x,char   *y)
{
int   i;
for(i=0;y[i]!= '\0 ';i++)
{
x[i]=y[i];                   // < < < < <4-----------跟入到这里开始出问题,可以直接在这里设置断点          
}                                                         //跟入到这里以后不论main()中是*a[10],还是a[][10],x[0]和y[0]的数值类型都是char,
}                                                                         //不过如果main()中是*a[10],到这一个断点就开始出错了,为什么都是char还出错呢??

template   <class   T>
void   swap(T   *x,T   *y)
{
char   temp[10];
strcp(temp,x);
strcp(x,y);             // < < < < < < <3----------跟进
strcp(y,temp);
}

template <class   T>
void   bubblesort(T   *a[10],int   n)
{
int   i,   j;
int   index;
i   =   n-1;
while   (i   >   0)
{
index   =   0;
for   (j   =   0;   j   <   i;   j++)
if   (strcmp(a[j+1],a[j])> 0)
{
swap(a[j+1],a[j]);     // < < < < <2--------------------跟进
index   =   j;
}
i   =   index;
}
}

void   main()
{
int   i;
char   *data[10]   =   { "Fortran ", "Basic ", "pascal ", "C ", "C++ "};       //char   *data[10]   =   { "Fortran ", "Basic ", "pascal ", "C ", "C++ "};
cout < < "before   sort: " < <endl;
for(i   =   0;   i   <   5;   i++)
cout < <data[i] < < '- ';
cout < <endl;
bubblesort(data,   5);       // < < < < <-------------------1跟进

cout < < "after   sort: " < <endl;

for(i   =   0;   i   <   5;   i++)
cout < <data[i] < < '- ';
cout < <endl;
}

[解决办法]
char *data[10]分配了长度为10的指针组,存放的是地址
而初始化char *data[10] = { "Fortran ", "Basic ", "pascal ", "C ", "C++ "};


相当于data[0] = "Fortran ";第0个地址指向静态区,内容只读,所以出错
data[1],data[2],...相同

char data[10][20]直接分配10个连续的char[20]
可以看作
typedef char String[20];//20个字符组成一个单元
String data[10];//分配10个单元,初始化情况和char data[10]或char data[]相同,只是char改为String

lz说的char a[][10]是以char[10]为单元,单元数量待定,和char *a[10]完全不同
[解决办法]
char a[][10]
这样的声明,说明它的元素,放的是char [10]至于个数在定义的获知
char *a[10]定义10个char*元素的数组


[解决办法]
可以定义 char a[][10]?
数组应该给出每一维的大小吧.


[解决办法]
[]结合优先级高于*
[解决办法]
char *a[10] 指针数组, 一维的,每个数组中都存放一个char*的东东
char a[][10] 二维数组,

typedef char * CHAR_

CHAR_ a[10];
char a[][10];
这就是区别。
[解决办法]
同意 结合优先级的解释

应该写成char (*a)[10]就不会有问题了

[解决办法]
fosjos(无聊的菜鸟程序员) ( ) 信誉:100
is right;//静态区,内容只读
需要更改的地方:
1.char *data[10] = { "Fortran ", "Basic ", "pascal ", "C ", "C++ "};
改为:

char data[][10] = { "Fortran ", "Basic ", "pascal ", "C ", "C++ "};
2.void bubblesort(T *a[10],int n)
改为void bubblesort(T (*a)[10],int n)
或者void bubblesort(T a[][10],int n)

[解决办法]
你还可以这样看
传递参数 void bubblesort(T *a[10],int n)//等价 (T*) a[10];
void bubblesort(T (*a)[10],int n)// 等价于T * a=&data[0];
[解决办法]
实际上不要被[10]给迷惑了,把[10]去掉,大家是不是就可以明白了。
实际上就是指针和数组的区别。
*p= "xxxx " "xxxx "为常量,有常量存储空间。
p[]= "xxxx " "xxxx "看上去也向常量,但是没有存储空间。
写一个程序,看一下地址就明白了。

[解决办法]
char *a[10] 表示一个数组,相当于 (char *) a [10] (当然你这样写是不合法的)
他的意思是:a是一个数组,大小为10,这个数组的类型是 char *的,即这个数组的类型是指针

char a[][10] 表示一个指针,相当于 char (* a) [10] (注意char (* a) [10]与char *a[10] 是不一样的)
他的意思是:这个指针指向了一个数组,被指向的这个数组的类型是char型的,大小为10

char a[][10] 一般是函数形参的写法

热点排行