user-0 提问: 调用函数进行字符串排序，运行出错是什么原因？

回复:
user: user-0
content: 引用 4 楼 zxh707wk 的回复:第40行 j=i+1   感谢指正！！

user: user-0
content: 引用 11 楼 wanght99 的回复:而且j是没初始化的.  感谢你的分析！ 写成j=j+1了，应该是j=i+1

user: user-1
content: 引用 7 楼 yshhq 的回复:[quote=引用 5 楼 xiaohuh421 的回复:] char (*p)[20]   // 指向数组的指针, 这个指针可能指向一个char类型, 有20个元素的数组. char *p[]          //指针数组, 数组里面保存的是char*.  区别就在这里, 所以会提示你那个错误  谢谢，还是不太明白为什么会出错，char (*p)[20]  、char *p[]     对应的p[i]是不是一样的？ [/quote]  error C2664: 'sort' :    cannot convert parameter 1 from 'char [20]' to 'char *[]' 这都不明白?   这个错误就是提示参数类型不一致撒.

user: user-2
content: 引用 10 楼 wanght99 的回复:[quote=引用 8 楼 yshhq 的回复:] [quote=引用 2 楼 wanght99 的回复:] 形参的问题 单看char *p[]这个p先和[]结合, 再和*结合, 表示p先是一个数组, 数组里内容是指针. 但如果它作为一个形参, C里是不能直接对数组传值的, 数组会转化成相应类型的指针, 所以 char *p[]相当于是char **p. 也就是"指针的指针"  但问题就来了,  char str[N][20]; 是一个 "数组的数组", 在作实参传递的时候,  它变成了"数组的指针". 而"数组的指针", 和 "指针的指针"是不一样的, 就出现的类型的不匹配. 所以会报错.  受教了！ 那么用char (*p)[20]做形参时，排序会出错是为什么？[/quote]  看了眼你的程序, 逻辑有问题吧, 你的j在第一次循环之后就是N了, 以后都不会去比较了.[/quote] 而且j是没初始化的.

user: user-2
content: 引用 8 楼 yshhq 的回复:[quote=引用 2 楼 wanght99 的回复:] 形参的问题 单看char *p[]这个p先和[]结合, 再和*结合, 表示p先是一个数组, 数组里内容是指针. 但如果它作为一个形参, C里是不能直接对数组传值的, 数组会转化成相应类型的指针, 所以 char *p[]相当于是char **p. 也就是"指针的指针"  但问题就来了,  char str[N][20]; 是一个 "数组的数组", 在作实参传递的时候,  它变成了"数组的指针". 而"数组的指针", 和 "指针的指针"是不一样的, 就出现的类型的不匹配. 所以会报错.  受教了！ 那么用char (*p)[20]做形参时，排序会出错是为什么？[/quote]  看了眼你的程序, 逻辑有问题吧, 你的j在第一次循环之后就是N了, 以后都不会去比较了.

user: user-0
content: 引用 1 楼 caozhy 的回复:char ** p看看  不行。提示error C2664: 'sort' : cannot convert parameter 1 from 'char [3][20]' to 'char ** '

user: user-0
content: 引用 2 楼 wanght99 的回复:形参的问题 单看char *p[]这个p先和[]结合, 再和*结合, 表示p先是一个数组, 数组里内容是指针. 但如果它作为一个形参, C里是不能直接对数组传值的, 数组会转化成相应类型的指针, 所以 char *p[]相当于是char **p. 也就是"指针的指针"  但问题就来了,  char str[N][20]; 是一个 "数组的数组", 在作实参传递的时候,  它变成了"数组的指针". 而"数组的指针", 和 "指针的指针"是不一样的, 就出现的类型的不匹配. 所以会报错.  受教了！ 那么用char (*p)[20]做形参时，排序会出错是为什么？

user: user-0
content: 引用 5 楼 xiaohuh421 的回复:char (*p)[20]   // 指向数组的指针, 这个指针可能指向一个char类型, 有20个元素的数组. char *p[]          //指针数组, 数组里面保存的是char*.  区别就在这里, 所以会提示你那个错误  谢谢，还是不太明白为什么会出错，char (*p)[20]  、char *p[]     对应的p[i]是不是一样的？

user: user-3
content: 纯粹来骗分  void sort(char (*p)[20]) { 	char k[20]; 	int x; 	 	for(int i=0; i<N; i++) { 		x = i; 		for(int j=i+1; j<N; j++) {  			if(strcmp(*(p+i), *(p+j)) > 0) { 				x = j; 			} 		}  		if(x!=i) { 			strcpy(k, *(p+i)); 			strcpy(*(p+i), *(p+x)); 			strcpy(*(p+x), k); 		} 		 	} }

user: user-4
content: char ** p看看

user: user-1
content: char (*p)[20]   // 指向数组的指针, 这个指针可能指向一个char类型, 有20个元素的数组. char *p[]          //指针数组, 数组里面保存的是char*.  区别就在这里, 所以会提示你那个错误

user: user-5
content: 第40行 j=i+1

user: user-6
content: void sort(char (*p)[N][20]); sort(&str);  void sort(char (*p)[N][20]) {     int i, j, k;     char temp[20];     for(i=0; i<N-1; i++)     {         k=i;         for(j=j+1; j<N; j++)             if(strcmp((*p)[k],(*p)[j])>0)    k=j;         if(k!=i)         {                 strcpy(temp, (*p)[k]); strcpy((*p)[k], (*p)[i]); strcpy((*p)[i], temp); //            temp=p[k]; p[k]=p[i]; p[i]=temp;    //为什么不可以这么写？因为temp等数组名是只读的         }     } }

user: user-2
content: 形参的问题 单看char *p[]这个p先和[]结合, 再和*结合, 表示p先是一个数组, 数组里内容是指针. 但如果它作为一个形参, C里是不能直接对数组传值的, 数组会转化成相应类型的指针, 所以 char *p[]相当于是char **p. 也就是"指针的指针"  但问题就来了,  char str[N][20]; 是一个 "数组的数组", 在作实参传递的时候,  它变成了"数组的指针". 而"数组的指针", 和 "指针的指针"是不一样的, 就出现的类型的不匹配. 所以会报错.