为什么不能改成str + i ?#include stdio.h#include string.hint main (void){void sort (char str[ 10
为什么不能改成str + i ?
#include <stdio.h>
#include <string.h>
int main (void)
{
void sort (char str[ 10 ][ 10 ]) ;
char str[ 10 ][ 10 ] ;
int i ;
printf_s ("Input string:\n");
for ( i = 0 ; i < 10 ; i++ )
{
gets_s ( str[ i ]) ;
}
sort ( str );
printf_s ("Now,matrix:\n") ;
for ( i = 0 ; i < 10 ; i++ )
{
printf_s ( "%s" , str[ i ] ) ;
printf_s ("\n") ;
}
}
void sort ( char str[ 10 ][ 10 ] )
{
int i , j ;
char temp[ 10 ] , * p ;
p = temp ;
for ( i = 0 ; i < 10 ; i ++ )
{
for ( j = i + 1 ; j < 10 ; j ++ )
{
if ( strcmp ( str[ i ] , str[ j ] > 0 ) /* 这里为什么不能写成 if ( strcmp ( (str + i) , (str + j) ) > 0 )*/
{
strcpy ( p , str[ i ] );
strcpy ( str[ i ] , str[ j ] );
strcpy ( str[ j ] , p );
}
}
}
}
[解决办法]str[?i?] 和 str+i 一样吗?还是*(str+i)?
[解决办法]
if ( strcmp ( str[ i ] , str[ j ] > 0 ) /* 这里为什么不能写成 if ( strcmp ( (str + i) , (str + j) ) > 0 )*/
//上面的那个函数用的,写错了吧
if ( strcmp ( str[ i ] , str[ j ] ) > 0 ) //这样吧!
至于你说的为什么不用str+ i,这里是不行的!因为这里是二维数组了!
str[i] 和str+ i是不一样的,地址不一样了, 可以把地址打印出来看看,就明白了!
[解决办法]str[i]等于*(str+i)
str[i][j]等于*(*(str+i)+j)
多维数组可以一直这样套。
左边取地址,右边去掉一个*号:
&str[i]等于str+i
&str[i][j]等于*(str+i)+j
[解决办法]楼上回答很正确!
楼主我觉得你搞混了啊,你这里是要对字符串进行操作,应该是char *a[10]啊(指针数组)!
void sort ( char str[ 10 ][ 10 ] )等价于void sort ( char (*str)[ 10 ] )也就是说二维数组做形参的时候已经退化为数组指针了!
有疑问加我Q1179675084
[解决办法]补充:
str[i]等于&str[i][0]
即:
*(str+i)等于*(str+i)+0
[解决办法]如果是一维数组str[10],就是:
str等于&str[0]等于str+0
str+i等于&str[i]
二维数组的每一个元素就是一个一维数组,代进去就可以了,这样就比较容易理解。
[解决办法]指针的加减运算也是根据这个公式。
[解决办法]8楼说得比较清楚了。
但是楼主你要注意一点啊,你那个疑问是在一个函数sort() 里面的,str 是一个输入参数,虽然你写的是char str[][], 但是编译器会把这个认为是一个char **str, 所以str + i 就是一个指针的加减法操作,这里的str + i 指的是从str 这个地址往后偏移sizeof(char *) * i个字节之后的一个地址。
[解决办法]补充:这里意思就是数组名str就是数组的首地址,str+i就是数组(从0开始)第i个元素的地址。
[解决办法]楼主可以看一下谭浩强《C程序设计》第4版,讲的很清楚。