指针的赋值情况高分

来源:百度知道 编辑:UC知道 时间:2024/05/14 12:04:07
#include<string.h>
main()
{void pailie(char *[]);
char a[5][5],*p[5];
int i;
printf("请输入");
for(i=0;i<5;i++)
{scanf("%s",a[i]);
p[i]=a[i];}
pailie(p);
}
void pailie(char *p[5])
{int i,j;
char **t;
for(i=0;i<5;i++)
for(j=i;j<4;j++)
if(strcmp(p[j],p[j+1])>0)
{*t=p[j];
p[j]=p[j+1];
p[j+1]=*t;
}
for(i=0;i<5;i++)
printf("%s\n",p[i]);
}

{*t=p[j];
p[j]=p[j+1];
p[j+1]=*t;
}
我给改成
{*t=*p[j];
*p[j]=*p[j+1];
*p[j+1]=*t;
}
跟{t=*p[j];
*p[j]=*p[j+1];
*p[j+1]=t;
}

{**t=p[j];
p[j]=p[j+1];
p[j+1]=**t;
}
都能正确运行 但是改成
{**t=p+j;
p+j=p+j+1;
p+j+1=**t;
}
就 错误 为什么呢

有点奇怪,其中有的在我这里运行是异常的。
建议你再仔细查一查。

但是如果抛开这些先不论的话,关于你的问题可以这么解释:
首先分析一下你代码里面的几个字符串数组/二维指针:
char a[5][5]:
二维字符数组,也就是字符串数组,
包含5个字符串,每个字符串的最大长度为5。
这么定义后,a指向的是常量区,它的指向内容不允许变更。

*p[5];
指针数组,包含5个成员,每个成员为一个字符指针。
在这段程序里,p的每一个成员均指向a的行首地址。

char **t;二维字符指针

所以,可以看出:
你所说的能正确运行的那几段代码,都是对于行首地址的处理,
详细的说就是通过t整个中间量,来交换p中成员所指向的行首地址。
由于交换的是行首地址,所以按照"printf("%s\n",p[i])"进行输出时,
实现的是字符串交换的效果。

而下面这一段就不对了:
{**t=p+j;
p+j=p+j+1;
p+j+1=**t;
}
这一段处理,其实是针对行首地址进行偏移后,所指向的地址的处理。
如果p指向a的第0行的行首地址的话(也就是a[0]),
那么p+j的意思是,第0行偏移j位的地址,
这就是一个具体字符的地址(第0行的第j个成员,也就是第一个字符串的第j个字符),
这么交换,当然是错误的,实现不了字符串交换的目的。

**t是一个char型变量,使用前没给*t赋值

**t是内容p+i是指针即地址,**t没有赋值,接下来的就不知道了

没有[]就成了实际数,J+1=J又等于T逻辑错误

别的不说,请lz先回顾赋值语句:

变量=<值|表达式>

等号左面的只能是变量。
如果是指针,变量里的内容是一个内存地址,加上*操作符以后相当于变量(指向该内存地址)。

所以不能这样写:<