天天看點

資料結構-字元串的排列

題目:輸入

一個字元串,列印出該字元串中字元的所有排列。例如輸入字元串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" 複制到該記憶體裡面,這個記憶體是可讀寫的

指針是不配置設定記憶體的,它指向的是系統的隻讀的記憶體,而數組是配置設定記憶體的,就是将系統的隻讀的記憶體裡面的值複制到它的記憶體裡面,是以可讀寫

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個位元組的記憶體單元)。在進行參數傳遞時,數組會自動退化為同類型的指針。