C primer plus系列7 指標

2021-10-07 18:37:50 字數 3567 閱讀 8972

1-p是指標,是位址;

int

*p;

2-程式設計習慣,空格位置

int

*p;//這裡強調*p是乙個int型別的變數,c程式設計師經常使用這種形式

int* p;

//這裡強調int*是乙個型別,用來定義指向int的指標

int* p1,p2;

//這樣建立的是乙個指標,乙個int型變數;因為乙個指標需要乙個*

3-c語言中可以使用malloc分配記憶體,c++中可以還可以使用new來分配記憶體

int

*pn =

newint

;//返回所配記憶體的首位址

4-只能用delete釋放由new分配的記憶體

如何使用呼叫動態陣列中的元素?

//使用new來建立動態陣列

int*p=

newint[10

];//返回所配記憶體的首位址

delete

p;//釋放記憶體

int

*pn =

newint[10

];pn[0]

=3; pn[1]

=4; pn[2]

=5; cout << pn[0]

<<

" "<< pn[1]

<< endl;

pn=pn+1;

//指標指向第二個位址

cout << pn[0]

<<

" "<< pn[1]

<< endl;

/*輸出結果:

3 44 5

5-指標和字串

注意:cout語句中 f 是代表字元「r"的位址,cout會從字元 r 開始輸出字串,一直遇到 '/0』為止;

此外,對於陣列中的字串、指標代表的字串、雙引號代表的字串常量,cout都是用來傳遞其位址,而不是傳遞字串,

char f[10]

="rose"

; cout << f <<

" is red"

;/**輸出結果

rose is red /

6-顯示字串的位址

為什麼用(int )animal顯示字串位址,而不是用(char )animal來顯示字串的位址?

答:要顯示字串的位址,則必須將這種指標(char型別)轉化成另一種指標型別,如int 或者double

char animal[20]

="bear"

;//陣列儲存字串

const

char

*bird =

"wren"

;//指標儲存字串

char

*ps;

cout << animal <<

" and "

; cout << bird << endl;

cout <<

"enter an kind of animal"

; cin >> animal;

//輸入fox

ps=animal;

cout<" at "

<<

(int

*)animal

cout<" at "

<<

(int

*)ps<

//使用new建立動態結構

struct inflatable ;

inflatable *p =

new inflatable;

//使用new建立動態結構

cout <<

"enter name of inflatable item"

<< endl;

cin.

get(p-

>name,20)

;//第一種輸入方法

cout <<

"enter a volume"

<< endl;

cin >>

(*p)

.volume;

//第二種輸入方法

cout <<

"enter the price"

<< endl;

cin >> p-

>price;

cout <<

"name: "

<< p-

>name <<

" volume: "

<< p-

>volume <<

" price: "

<>price<< endl;

/* 輸出結果

enter name of inflatable item

kevin

enter a volume

100enter the price

400name: kevin volume: 100 price: 400

*/

8-new和delete的乙個小例子

//使用new和delete管理記憶體(管理字串)

/如果要輸入100個字串,其中最長的字串為79個字元,

而大多數字串短的多,

**方法一:**如果要用char陣列來儲存這些字串,

需要100個陣列,其中每個陣列的長度為80個字元。這樣其實有很多記憶體沒有被使用

**方法二:**建立乙個陣列,它包含100個指向char的指標,然後使用new 根據每個字串的需要分配相應的記憶體

//建立函式

char

*getname()

{char name[80]

;char

*p; cout <<

"enter your name: "

<< endl;

cin >> name;

p =newchar

[strlen

(name)+1

];//p = name;//這是錯誤的,因為這樣只是修改了儲存在p中的位址

strcpy

(p,name)

;//在visual stdio 2013**現錯誤,還沒有解決

return p;

注意:為什麼要使用new來建立乙個指標,為什麼不直接返回name 位址呢?

答:因為name為「自動儲存」,只有在函式getname()活動時存在,當在main()函式中便將name的記憶體釋放了;

9-儲存

1-自動儲存

2-靜態儲存

靜態儲存:1-在函式外面定義;2-在宣告變數時,使用關鍵字static;

3-動態儲存

使用new和delete來管理記憶體,成為自由儲存空間或者堆(heap)

C primer plus系列5 共用體

與結構體的區別,只能同時儲存其中一種型別 union one pail pail.int val 15 cout pail.int val endl pail.long val 16 將會被覆蓋,因為共用體同時只能儲存其中一中型別 cout pail.int val endl cout pail.l...

C primer plus 系列2 字串

1 將字串存在陣列中的兩種方法 2 如何在陣列中使用字串 3 cin只能讀取乙個單詞,讀到換行符認為字串結束 4 介紹cin.get cin.getline 1 將字串存在陣列中的兩種方法 int a 5 0 用來標記字串結尾 int a 5 food 稱為字串常量 2 在陣列中使用字串 inclu...

c primer plus 第十三章課後程式設計7題

a 交替列印倆個檔案的每一行 include include int main int argc,const char ar if fc fopen ar 2 r null 如果第乙個檔案遇到換行符則列印第二個檔案內容,反之一樣 a 交替列印倆個檔案的每一行。利用檔案指標的特性自動遞增的特點 do ...