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] 一般是函数形参的写法