题目:输入
一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba
分析:这个题目完全不会。根据标案分析发现一些细节需要注意,char* 和char[]的区别。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来得231和312。因此可以知道——全排列就是从第一个数字起每个数分别与它后面的数字交换。找到这个规律后,递归的代码就很容易写出来了
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char*
p是一个指针,根本没分配内存,他指向的"abc123ABC" 是只读的,不能改变,你在下面给他赋值肯定是错的.而char
p[]是一个数组,已经分配内存,是将"abc123ABC" 复制到该内存里面,这个内存是可读写的
指针是不分配内存的,它指向的是系统的只读的内存,而数组是分配内存的,就是将系统的只读的内存里面的值复制到它的内存里面,因此可读写
char*
p是定义的一个指针。。他指向的字符窜"abc123ABC" 是存在不可修改的区域(代码区)的。。
而char
p[]是一个数组。。他的内容存在栈区可以修改
char
p[]="abc123ABC";
该条语句执行的是字符串数组的赋值操作是正确的
char
*p="abc123ABC";
字符指针变量p指向字符串常量"abc123ABC"的首地址
字符串常量存放在数据区的“常量段”
所以当你访问并修改时会内存出错
正确的操作应该是:
char * p = (char *
)malloc(10);
strcpy(p, "abc123ABC");
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
事实上数组和指针是有很大的区别的。
1.两者在含义上的区别。
数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
2.计算内存容量的区别。
用运算符sizeof可以计算出数组的容量(字节数),而用sizeof却无法计算指针所指内存的容量,用sizeof(p)得到的结果永远是4或者2(即指针变量所占内存单元的字节数,一般情况下指针变量占2个或4个字节的内存单元)。在进行参数传递时,数组会自动退化为同类型的指针。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>using namespace std;
void Sort(char* Str,char* begin){
if(*begin == ‘\0‘){
cout << Str << " " << flush;
}
else{
for(char* pCh=begin;*pCh!=‘\0‘;++pCh){char tmp = *pCh;
*pCh = *begin;
*begin = tmp;//swap(*pCh,*begin);
Sort(Str,begin+1);
//swap(*pCh,*begin);tmp = *pCh;
*pCh = *begin;
*begin = tmp;
}
}
}void Sort(char* Str){
if(Str == NULL){
return;
}Sort(Str,Str);
}int main()
{
char Str[] = "abc";Sort(Str);
return 0;
}
数据结构-字符串的排列