今天還在做著小作業,終於把框架大體搭好,準備脫離stl用c語言來解析字串。卻碰到了諸多問題。
原來堆疊基本不太懂,現在稍稍知道了,還有字串指標和陣列的區別。哎
簡單的寫了幾個定義和初始化字串的方式
char *szname1 = " dir \ad\ what are you doing"; // q全域性const區域
char szname2 = " dir \ad\ what are you doing";//棧 區
char *szname3 = new char[64]; //堆區
szname3 = " dir \ad\what are you doing";
char *szname4 = szname2; //棧區的指標指向棧區的記憶體
debug一看,原來果真只有 szname[2]是char型
debug資訊:
- szname1 0x0041564c " dir dwhat are you doing" char *
32 ' ' char
- szname3 0x0041564c " dir dwhat are you doing" char *
32 ' ' char
- szname4 0x0012ff38 " dir dwhat are you doing" char *
32 ' ' char
- szname2 0x0012ff38 " dir dwhat are you doing" char [27]
[0] 32 ' ' char
[1] 32 ' ' char
[2] 100 'd' char
......
我理解是:
指標儲存的僅僅是這個串的首位址,而串陣列儲存了整個串的資訊,陣列名可以用來訪問首位址,但並不是乙個指標!
我寫了乙個函式是要傳遞指標的指標,當我把szname1, szname3, szname4取位址傳過去可以,但是傳遞&szname2就不行了,提示錯誤是不能實現陣列的指標向指標的指標 轉換。
我曾經試圖傳遞指標的引用來實現修改字串指標的功能,szname1, szname3, szname4也可以實現引用的傳遞,而szname2 還是不行。其實我想得到乙個官方的解釋,暫時就先這樣理解了。
char amessage = "now is the time"; /* an array */
實際上等同於
char amessage[16] ;
strcpy(amessage, "now is the time" ;
16是字串"now is the time"的長度加1.
可以看出記憶體空間是分配在棧上的.
char *pmessage = "now is the time"; /* a pointer */
而pmessage指向的內容始終是常量,不可能被改變的.
而p = strdup(a)實際上等同於
p = (char*)malloc(strlen(a) + 1) ;
strcpy(p, a) ;
可以看出來,strdup返回的指標指向的是在堆上新分配的記憶體.
要修改也是修改新分配的記憶體空間中的內容.不是原來a指向的內容.
程式**:
#include "stdio.h"
#include "string.h"
const int max_length = 256;
void strrestrex(char **pnewstr, char c)
字串,字串陣列,字串指標!!
字串 字元陣列實際上是一系列字元的集合,也就是 字串 string 字串陣列 在c語言中,沒有專門的字串變數,沒有string型別,通常就用乙個字元陣列來存放乙個字串。c語言規定,可以將字串直接賦值給字元陣列 在c語言中,字串總是以 0 作為串的結束符。上面的兩個字串,編譯器已經在末尾自動新增了 0...
字串,陣列,堆,棧
0 2 1 4 3 9 5 8 6 7 是以陣列形式儲存的最小堆,刪除堆頂元素0後的結果是 a.2 1 4 3 9 5 8 6 7 b.1 2 5 4 3 9 8 6 7 c.2 3 1 4 7 9 5 8 6 d.1 2 5 4 3 9 7 8 6 正確答案 d 第二,堆是一種經過排序的完全二叉樹...
C 字串指標與字串陣列
在做面試100題中第21題時,發現char astr abcdefghijk 0 和char astr 有點區別,以前一直以為是一樣的,但是在該程式中採用字串指標執行一直出錯。後來在網上查查,果然發現大大的不同。分析 當你需要修改字串時,採用指標指向該字串編譯通過但是執行出錯,而採用字串陣列時不會出...