user-0 提问: 指针，请大佬指点

回复:
user: user-0
content: 引用 19 楼 寻开心 的回复:指向数组的指针啊。   不扩起来意思就不一样了，那就是一个指针的数组啦  拗口 数组的指针  vs  指针的数组 嗯，谢谢

user: user-1
content: 指向数组的指针啊。   不扩起来意思就不一样了，那就是一个指针的数组啦  拗口 数组的指针  vs  指针的数组

user: user-0
content: 引用 16 楼 寻开心 的回复:#include <stdio.h> #include <string.h>  void sortStr( char (*name)[40], int n) { 	for (int i=0; i<n-1; i++) 		for (int j=i+1; j<n; j++) { 			if ( strcmp(name[i], name[j])<0) { 				char temp[40]; 				strcpy(temp, name[i]); 				strcpy(name[i], name[j]); 				strcpy(name[j], temp); 			} 		} } void sort1( char * str) { 	char (*name)[40] = (char (*)[40]) str; 	sortStr(name, 10); } int main() { 	char book_name[10][40]={"DON QUIXOTE","EUGENIE GRANDET","MADAME BOVARY", "THE HUNCHBACK OF NOTRE DAME","FAUSTUS","BLACK AND RED","WAR AND PEACE", "Anna Karenina","Hamlet","Resurrection"}; 	sort1((char*)book_name); 	for (int i=0; i<10; i++)  	   printf("%s\n", book_name[i]);  	return 0; } (char (*)[40]) str;请问这个是什么意思，把*()起来的作用是什么呢

user: user-0
content: 引用 15 楼 ?Victor.?? 的回复:[quote=引用 14 楼 寻开心 的回复:] 非要用char *作为参数的函数形式， 那就要利用二维数组实际上也是一维数组的方式， 做一下强制转换吧。 嗯，谢谢，这个题也是很神奇[/quote] (char (*)[40]) str;请问这个是什么意思，把*()起来的作用是什么呢

user: user-1
content: #include <stdio.h> #include <string.h>  void sortStr( char (*name)[40], int n) { 	for (int i=0; i<n-1; i++) 		for (int j=i+1; j<n; j++) { 			if ( strcmp(name[i], name[j])<0) { 				char temp[40]; 				strcpy(temp, name[i]); 				strcpy(name[i], name[j]); 				strcpy(name[j], temp); 			} 		} } void sort1( char * str) { 	char (*name)[40] = (char (*)[40]) str; 	sortStr(name, 10); } int main() { 	char book_name[10][40]={"DON QUIXOTE","EUGENIE GRANDET","MADAME BOVARY", "THE HUNCHBACK OF NOTRE DAME","FAUSTUS","BLACK AND RED","WAR AND PEACE", "Anna Karenina","Hamlet","Resurrection"}; 	sort1((char*)book_name); 	for (int i=0; i<10; i++)  	   printf("%s\n", book_name[i]);  	return 0; }

user: user-0
content: 引用 14 楼 寻开心 的回复:非要用char *作为参数的函数形式， 那就要利用二维数组实际上也是一维数组的方式， 做一下强制转换吧。 嗯，谢谢，这个题也是很神奇

user: user-1
content: 非要用char *作为参数的函数形式， 那就要利用二维数组实际上也是一维数组的方式， 做一下强制转换吧。

user: user-1
content: #include <stdio.h> #include <string.h> void sortStr( char (*name)[40], int n) { 	for (int i=0; i<n-1; i++) 		for (int j=i+1; j<n; j++) { 			if ( strcmp(name[i], name[j])<0) { 				char temp[40]; 				strcpy(temp, name[i]); 				strcpy(name[i], name[j]); 				strcpy(name[j], temp); 			} 		} }

user: user-0
content: 引用 10 楼 user-2 的回复:不是=号，是逗号，复制粘贴的时候手误了 嗯嗯，对了，谢谢

user: user-0
content: 引用 8 楼 user-2 的回复:或者你直接改成指针的形式不用数组的形式  f(strcmp(s+min*40, s+j*40)>0) // strcpy(temp,s+i*40); //用指针的形式代替数组的形式 strcpy(s+i*40, s+min*40); strcpy(s+min*40, temp); 这个对了，谢谢

user: user-2
content: 不是=号，是逗号，复制粘贴的时候手误了

user: user-0
content: 引用 7 楼 user-2 的回复:main方法调用的时候要转换一下sortStr((char*)book_name); sortStr方法里复制的时候取一下地址 if(strcmp(&s[min*40],&s[j*40])>0) //  strcpy(temp,&s[i*40]); //注意字符串复制的地址就可以了 strcpy(&s[i*40]=&s[min*40]); strcpy(&s[min*40]=temp);  还有一点小问题

user: user-2
content: 或者你直接改成指针的形式不用数组的形式  f(strcmp(s+min*40, s+j*40)>0) // strcpy(temp,s+i*40); //用指针的形式代替数组的形式 strcpy(s+i*40, s+min*40); strcpy(s+min*40, temp);

user: user-2
content: main方法调用的时候要转换一下sortStr((char*)book_name); sortStr方法里复制的时候取一下地址 if(strcmp(&s[min*40],&s[j*40])>0) //  strcpy(temp,&s[i*40]); //注意字符串复制的地址就可以了 strcpy(&s[i*40]=&s[min*40]); strcpy(&s[min*40]=temp);

user: user-0
content: 引用 4 楼 user-2 的回复:[quote=引用 3 楼 ?Victor.?? 的回复:] 但题目给的是void sortStr(char *s)，这个不改的话有什么办法吗，确实指针有问题 那就做一下二维数组和一维数组的转换（因为数组的内存是连续的，二维数组也可以用一维来访问） void sortStr(char *s) { char temp[40]; int min,i,j; for(i=0;i<9;i++) { min=i; for(j=i+1;j<10;j++) { if(strcmp(s[min*40],s[j*40])>0) //一维数组和二维数组的下标关系，一维移动40个下标就变成二维的第一个元素的地址 min=j; // } if(i!=min) { strcpy(temp,s[i*40]); //注意字符串复制的地址就可以了 strcpy(s[i*40]=s[min*40]); strcpy(s[min*40]=temp); } } }     [/quote] 不好意思，又麻烦您了

user: user-0
content: 引用 4 楼 user-2 的回复:[quote=引用 3 楼 ?Victor.?? 的回复:] 但题目给的是void sortStr(char *s)，这个不改的话有什么办法吗，确实指针有问题 那就做一下二维数组和一维数组的转换（因为数组的内存是连续的，二维数组也可以用一维来访问） void sortStr(char *s) { char temp[40]; int min,i,j; for(i=0;i<9;i++) { min=i; for(j=i+1;j<10;j++) { if(strcmp(s[min*40],s[j*40])>0) //一维数组和二维数组的下标关系，一维移动40个下标就变成二维的第一个元素的地址 min=j; // } if(i!=min) { strcpy(temp,s[i*40]); //注意字符串复制的地址就可以了 strcpy(s[i*40]=s[min*40]); strcpy(s[min*40]=temp); } } }     [/quote]

user: user-2
content: 引用 3 楼 ?Victor.?? 的回复:但题目给的是void sortStr(char *s)，这个不改的话有什么办法吗，确实指针有问题 那就做一下二维数组和一维数组的转换（因为数组的内存是连续的，二维数组也可以用一维来访问） void sortStr(char *s) { char temp[40]; int min,i,j; for(i=0;i<9;i++) { min=i; for(j=i+1;j<10;j++) { if(strcmp(s[min*40],s[j*40])>0) //一维数组和二维数组的下标关系，一维移动40个下标就变成二维的第一个元素的地址 min=j; // } if(i!=min) { strcpy(temp,s[i*40]); //注意字符串复制的地址就可以了 strcpy(s[i*40]=s[min*40]); strcpy(s[min*40]=temp); } } }

user: user-0
content: 但题目给的是void sortStr(char *s)，这个不改的话有什么办法吗，确实指针有问题

user: user-2
content: 另外void sortStr(char *s)这里改成void sortStr(char **s) 或者 void sortStr(char *s[10])

user: user-2
content: 把sortStr方法的以下代码注释掉 for(i=0;i<10;i++) puts(s[i]); 在main方法的sortStr(book_name);之后追加以下代码 for(int i=0;i<10;i++) puts(book_name[i]);