c语言中指针数组和字符串数组的区别 ,高手请进!

要对几个字符串排序后输出。两个程序,只是对数组的定义不同,第一个定义的是指针数组,是对的;第二个定义的是字符串数组,却是错的。指针数组的v[i]和字符串数组的v[i]不都... 要对几个字符串排序后输出。
两个程序,只是对数组的定义不同,第一个定义的是指针数组,是对的;第二个定义的是字符串数组,却是错的。指针数组的v[i]和字符串数组的v[i]不都是表示指向一个字符串的一级指针吗?二者有什么不同?为什么第二个是错的?
程序一:
#include "stdio.h"
main()
{char *line[]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}

shellsort(v,n)
char *v[];
int n;
{char *t;
int i,j;
for(i=0;i<n-2;i++)
{for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
}
}

writeline(linp,n)
char *linp[];
int n;
{int i;
for(i=0;i<n;i++)
printf("%s\n",linp[i]);
}
程序二:
#include "stdio.h"
main()
{char line[][10]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}

shellsort(v,n)
char v[][10];
int n;
{char *t;
int i,j;
for(i=0;i<n-2;i++)
{for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
}
}

writeline(linp,n)
char linp[][10];
int n;
{int i;
for(i=0;i<n;i++)
printf("%s\n",linp[i]);
}
字符串数组中v[i]不也可以表示指向这个字符串第一个字符的一级指针吗?
展开
 我来答
jackys2007
推荐于2016-03-18 · TA获得超过1913个赞
知道小有建树答主
回答量:828
采纳率:100%
帮助的人:931万
展开全部
#include "stdio.h"
#include "string.h"
void shellsort(char v[][10], int n);
void writeline(char linp[][10],int n);
main()
{
char line[][10]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}

shellsort(char v[][10], int n)
{
char *temp,*t[5];
int i,j;

for(i=0;i<n;i++)
t[i]=&v[i];

for(i=0;i<n-2;i++)
for(j=n-1;j>i;j--)
if(strcmp(t[j-1],t[j])>0)
{
temp=t[j];
t[j]=t[j-1];
t[j-1]=temp;}
}

writeline(char linp[][10],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",linp[i]);
}
上面是修改过的程序;
关键在于
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
这里面的v[j]=v[j-1];这句不对,因为这是两个地址,也是两个数组,不能赋值
我用了另外的一组指针来指向这个数组

你的函数的定义很奇怪,更奇怪这样的定义也能编译
建议象我这样定义吧,不然别人看程序很困难的.
wangruigaoshou
2007-07-29 · TA获得超过3237个赞
知道小有建树答主
回答量:1334
采纳率:0%
帮助的人:0
展开全部
指针数组的内容是v[i]的地址,字符串数组的v[i]是第i项的内容.值和地址不一回事.了解一下指针的定义.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
势雪夙冷亦
2019-06-12 · TA获得超过3784个赞
知道大有可为答主
回答量:3190
采纳率:26%
帮助的人:277万
展开全部
方法一用来交换字符串的原理是改变指针数组成员指向的地址,这没有问题。
但是如果把line声明成2维数组,数组的地址值是不能随意修改的,所以,你无法强制把line[0]指定到其他地方。
可把方法二的字符串交换处理作如下改动:
{
char
t[10];
int
i,j;
for(i=0;i<n-2;i++)
{
for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{
/*t=v[j];v[j]=v[j-1];v[j-1]=t;*/
strcpy(t,
v[j]);
strcpy(v[j],
v[j-1]);
strcpy(v[j-1],
t);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式