字串及字元指標

2022-03-31 10:34:49 字數 1831 閱讀 4143

近來在學習字串的一些操作,對字串有些認識:

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宣告的變數 存放在這個區的資料程式全部執行結束後系統自動釋放,宣告週期貫穿於整個程式執行過程。全域性變數和靜態變數的儲存是放在一...