近來在學習字串的一些操作,對字串有些認識:
1、字串在使用時才動態分配的。
2、程式在宣告字串變數時,實際分配的是32位的記憶體空間的乙個指標。該指標指向儲存實際字串的記憶體位址。當字串為空時,其指標值為nil。
所以 str:='borland delphi';
sizeof(str);返回的結果將是4,而不是字串的長度。
3、字串的內容的內存在堆中分配。(但如果是如str:=form1.caption常量,則是在棧中分配)
4、不同的字串變數,如果是儲存一樣的內容,則記憶體中只儲存乙份內容。字串變數的位址是一樣的,採用引用計數技術。只有改變字串內容時,才採用copy-on -write技術,分配另一記憶體進行儲存。
5、字串與一維字元陣列很相似。但區別在於字串的下標是以str[1]開始,而且str[0]是不可訪問的。並且以#0結尾。
1procedure
tform2.button1click(sender: tobject);
2var3
a,b,c:
string;4
p:pint;
5q:pchar;
6begin
7memo1.clear;
8with
memo1.lines do9
begin
10a:=
'delphi';
11b:=
'delphi';
12c:=
a;13
p:=@a;14
q:=@a[1
];//
不能使用q:
=@a[0];
15add(
'a''s address: '+
inttostr(integer(@a)));
16add(
'b''s address: '+
inttostr(integer(@b)));
17add(
'c''s address: '+
inttostr(integer(@c)));
18add(
'in a: '+
inttostr(integer(a)));
19add(
'in b: '+
inttostr(integer(b)));
20add(
'in c: '+
inttostr(integer(c)));
21add(
'sizeof a: '+
inttostr(sizeof(a)));
22add(
'a''s adress'+
inttostr(integer(p)));
23while
q^<>#0
do24
begin
25add(q^+'
;address'+
inttostr(integer(q)));
26inc(q);
27end;
28end;
//with
lines
29end;
30執行的結果如下:
乙個很奇怪的結果是字串a與b,c的位址竟然不同。如果將q=@a[1];這一語句去掉,則 a,b,c位址是一致的。為什麼會改變呢?而且位址是低位的位址(已經不是'delphi'的位址了)。難道在q=@a[1]時,複製了乙份到另一記憶體空間?如果有哪位大俠知道,請教小弟一聲。
從字元指標,查詢每個字元的位址可以看到,delphi2009 的char是unicode的,每個字元佔2個位元組。
b c 位址一致,是因為他們都指向'delphi'字串的堆位址。
字串,字串陣列,字串指標!!
字串 字元陣列實際上是一系列字元的集合,也就是 字串 string 字串陣列 在c語言中,沒有專門的字串變數,沒有string型別,通常就用乙個字元陣列來存放乙個字串。c語言規定,可以將字串直接賦值給字元陣列 在c語言中,字串總是以 0 作為串的結束符。上面的兩個字串,編譯器已經在末尾自動新增了 0...
C 字元 字串 字元陣列 字串指標 指標陣列
一 c 字元 字串 字元陣列 字串指標 指標陣列 前言 一 字元指標 字元陣列 二 字串指標 三 字串 指標陣列 四 常用方法 參考為了深入理解c 並時常回顧學過的知識點,對c 知識點進行記錄總結。參考1字元指標的儲存方式 字元指標變數本身是乙個變數,用於存放字元 字串的首位址。字串本身是存放在以該...
字元指標, 字元陣列, 字串
預備知識 c程式在記憶體中的空間占用分配 1 區 存放程式 2 資料區 a.靜態資料區 在編譯器進行編譯的時候就為該變數分配的記憶體,即全域性變數和靜態變數 用static宣告的變數 存放在這個區的資料程式全部執行結束後系統自動釋放,宣告週期貫穿於整個程式執行過程。全域性變數和靜態變數的儲存是放在一...