亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ Primer Plus 第四章之C++ Primer Plus復(fù)合類(lèi)型學(xué)習(xí)筆記

 更新時(shí)間:2021年07月27日 09:06:52   作者:Soler索萊爾HO  
數(shù)組(array)是一種數(shù)據(jù)格式,能夠存儲(chǔ)多個(gè)同類(lèi)型的值。每個(gè)值都存儲(chǔ)在一個(gè)獨(dú)立的數(shù)組元素中,計(jì)算機(jī)在內(nèi)存中依次存儲(chǔ)數(shù)組的各個(gè)元素,今天給大家重點(diǎn)介紹C++ Primer Plus復(fù)合類(lèi)型的實(shí)例詳解,感興趣的朋友一起看看吧

1. 數(shù)組概述

1.1 數(shù)組的定義

數(shù)組(array)是一種數(shù)據(jù)格式,能夠存儲(chǔ)多個(gè)同類(lèi)型的值。每個(gè)值都存儲(chǔ)在一個(gè)獨(dú)立的數(shù)組元素中,計(jì)算機(jī)在內(nèi)存中依次存儲(chǔ)數(shù)組的各個(gè)元素。

數(shù)組聲明的三個(gè)特點(diǎn):

  • 存儲(chǔ)在每個(gè)元素中的值的類(lèi)型
  • 數(shù)組名
  • 數(shù)組中的元素?cái)?shù)

C++中可以通過(guò)修改簡(jiǎn)單變量的聲明,添加中括號(hào)(其中包含元素?cái)?shù)目)來(lái)完成數(shù)組聲明。

例如:

short days[24]; // 一天有24個(gè)小時(shí)

1.2 數(shù)組的聲明

聲明數(shù)組的的一般語(yǔ)法格式為:

// 數(shù)組類(lèi)型 數(shù)組名字[數(shù)組的大小]
int score[4]; // 四個(gè)人的分?jǐn)?shù),整型數(shù)組

數(shù)組的大小是指定元素的數(shù)目,必須是整型常數(shù)或const值,也可以是常量表達(dá)式(8*sizeof(int))

1.3 復(fù)合類(lèi)型的數(shù)組

可以使用其他的類(lèi)型來(lái)創(chuàng)建(C語(yǔ)言使用術(shù)語(yǔ):派生類(lèi)型

數(shù)組的用途,可以單獨(dú)訪問(wèn)數(shù)組元素,方法是:使用下標(biāo)索引對(duì)元素進(jìn)行編號(hào)。從0開(kāi)始編號(hào)。

編譯器不會(huì)檢查下標(biāo)是否有效,所以要注意下標(biāo)合法性,避免程序異常問(wèn)題。
C++使用索引的方括號(hào)表示法來(lái)指定數(shù)組元素。

1.4 數(shù)組的初始化規(guī)則

1.只有在定義數(shù)組時(shí)才能初始化,此后不能使用,也不能將一個(gè)數(shù)值賦給另一個(gè)數(shù)組。

2.初始化數(shù)組時(shí),提供的值少于數(shù)組的元素?cái)?shù)目。

3.如果只對(duì)數(shù)組的一部分進(jìn)行初始化,則編譯器把其他元素設(shè)置為0。

4.如果初始化為{1}而不是{0},則第一個(gè)元素被設(shè)置為1,其他元素都被設(shè)置為0.

5.如果初始化數(shù)組方括號(hào)內(nèi)([])為空,C++編譯器將計(jì)算元素個(gè)數(shù)。 例如:short things[] = {1,3,5,7};

1.5 C++11數(shù)組初始化方法

C++11將使用大括號(hào)的初始化(列表初始化)作為一種通用的初始化方式,可用于所有類(lèi)型。

在C++中列表初始化就增加了一些功能:

初始化數(shù)組時(shí),可省略等號(hào)(=)

double earnings[4] {1.2e4,1.6e4,1.1e4,1.7e4};

可不在大括號(hào)內(nèi)包含任何東西,這會(huì)將所元素都設(shè)置為零。

unsigned int const[10] = {};

float balances[100] {};

列表初始化禁止縮窄轉(zhuǎn)換。

long num[] = {25,92,3.0}; // 浮點(diǎn)數(shù)轉(zhuǎn)換為整型是縮窄操作

例子:

#include<iostream>

using namespace std;

int main()
{
    // 創(chuàng)建一個(gè)名字為yams的數(shù)組,包含了3個(gè)元素,編號(hào)是0~2.
    int yams[3];
    yams[0] = 7;
    yams[1] = 8;
    yams[2] = 6;

    // 使用逗號(hào)分隔的值列表(初始化列表),然后用花括號(hào)括起來(lái)即可。
    // 列表中的空格是可選的,如果沒(méi)有初始化函數(shù)中定義的數(shù)組,其元素值也是不確定。
    int yamcosts[3] = {1,2,3};

    cout<<"yams 數(shù)組是:"<<yams[0]+yams[1]+yams[2]<<endl;
    cout<<"yams[1] = "<<yams[1]<<endl;
    int total = yams[0] * yamcosts[0] + yams[1] * yamcosts[1];
    total = total + yams[2] * yamcosts[2];
    cout<<"total yam = "<<total<<endl;

    // sizeof運(yùn)算符返回類(lèi)型或數(shù)據(jù)對(duì)象的長(zhǎng)度(單位為字節(jié))。
    // 如果將sizeof運(yùn)算符用于數(shù)組名,得到的是整個(gè)數(shù)組的字節(jié)數(shù)。
    // 如果sizeof用于數(shù)組元素,得到的是元素的長(zhǎng)度(單位為字節(jié))。
    cout<<"\n yams數(shù)組的大小 = "<<sizeof(yams)<<" Bytes.\n";
    cout<<"一個(gè)元素的大小 = "<<sizeof(yams[0])<<" Bytes.\n";

    return 0;
}

2. 字符串

字符串是存儲(chǔ)在內(nèi)存的連續(xù)字節(jié)中的一系列字符。

2.1 C++處理字符串的兩種方式:

C語(yǔ)言,常常被稱(chēng)為C-風(fēng)格字符串(C-style String)

以空字符(\0,ASCII碼對(duì)應(yīng)為0)來(lái)標(biāo)記字符串的結(jié)尾。

基于String類(lèi)庫(kù)的方法

存儲(chǔ)在連續(xù)字節(jié)中的一系列字符意味著可以將字符串存儲(chǔ)在char數(shù)組中。其中每個(gè)字符都位于自己的數(shù)組元素中。

使用引號(hào)括起來(lái)的字符串,這種字符串叫 字符串常量(String constant)字符串字面值(string literal) 。

字符串常量(使用雙引號(hào))不能與字符常量(使用單引號(hào))互換。

例如:

char name[] = "Soler";

字符串結(jié)尾的空字符,不用直接顯式包括,機(jī)器在鍵盤(pán)輸入,將字符串讀入到char類(lèi)型中,會(huì)在結(jié)尾自動(dòng)加上空字符。

⚠️注意:確定了存儲(chǔ)字符串所需的最短數(shù)組時(shí),不要忘記把結(jié)尾的空字符包括在內(nèi)。

2.2 字符串常量的拼接

方法:直接兩個(gè)引號(hào)括起來(lái)的字符串合并為一個(gè)。任何兩個(gè)由空白(空格、制表符和換行符)分隔的字符串常量都將自動(dòng)拼接成一個(gè)。

cout<<"My name is " "Soler HO.\n" 

2.3 在數(shù)組中使用字符串

將字符串存儲(chǔ)到數(shù)組的常用方法:

  • 將數(shù)組初始化為字符串
  • 常量將鍵盤(pán)或文件輸入讀入到數(shù)組中。
#include <iostream>
#include <cstring> /*提供strlen()函數(shù)*/
using namespace std;

const int Size = 15;

int main()
{
    char name1[Size];
    char name2[Size] = "C++owboy";
    // 字符串的拼接
    cout<<"Howdy!I'm "<< name2;
    cout<<"!,What's your name?\n";
    cin>>name1;

    cout<<"Well, "<<name1<<",your name has : "<<strlen(name1)<<" letters and is stored!\n" ;
    cout<<"In an array of "<<sizeof(name1)<<" Bytes\n";
    cout<<"Your iniatial is "<<name1[0]<<".\n"; // name1數(shù)組中的第一個(gè)元素
    name2[3] = '\0';
    cout<<"Here are the first 3 characters of my name:"<<name2<<endl;

    return 0;
}

strlen() 函數(shù)sizeof()運(yùn)算符的區(qū)別

strlen()函數(shù)

返回的是存儲(chǔ)在數(shù)組中的字符串的長(zhǎng)度,而~~不是數(shù)組本身的長(zhǎng)度~~。strlen()只計(jì)算可見(jiàn)的字符,而不把空字符計(jì)算在內(nèi)。

sizeof() 運(yùn)算符

指出變量數(shù)據(jù)類(lèi)型字節(jié)大小??捎糜讷@取類(lèi)、結(jié)構(gòu)、共用體和其他用戶自定義數(shù)據(jù)類(lèi)型的大小。

2.4 讀取一行字符串的輸入

解決沒(méi)有逐行讀取輸入的缺陷。

istream中提供了面向行的類(lèi)成員函數(shù):getline()get() 函數(shù)

2.4.1 面向行的輸入:getline()

使用通過(guò)回車(chē)鍵輸入的換行符來(lái)確定輸入結(jié)尾。使用 cin.getline() 。

函數(shù)有兩個(gè)參數(shù):

  • 第一個(gè)參數(shù):存儲(chǔ)輸入行的數(shù)組名稱(chēng)。
  • 第二個(gè)參數(shù):要讀取的字符數(shù)(注意包含結(jié)尾的空字符(\0))。

格式:

cin.getline(name,ArSize);

2.4.2 面向行的輸入:get()

getline() 函數(shù)類(lèi)似,接受的參數(shù)相同,解釋參數(shù)的方式也相同,并讀到行尾。

區(qū)別:get() 讀取并丟棄換行符,將其留在輸入隊(duì)列中。

格式:

cin.get(name,ArSize);

get() 將兩個(gè)類(lèi)成員函數(shù)拼接(合并):

cin.get(name,ArSize).get();

⚠️注意:get() 函數(shù)讀取空行后設(shè)置會(huì)失效,輸入會(huì)被阻斷??捎萌缦禄謴?fù):

cin.clear();

混合輸入數(shù)字和面向行的字符串會(huì)導(dǎo)致的問(wèn)題:無(wú)法輸入地址。

解決方法:直接使用get()進(jìn)行讀取之前丟棄換行符。

3. string類(lèi)

string類(lèi)位于名稱(chēng)空間std中,所以需要提供using指令或者是直接使用std::string進(jìn)行引用。

要使用string類(lèi),必須在程序中包含頭文件string中。

string類(lèi)定義隱藏了字符串的數(shù)組性質(zhì)。

3.1 string對(duì)象的方式

使用string對(duì)象的方式和使用字符數(shù)組相同。

  • C-風(fēng)格字符串來(lái)初始化string對(duì)象中。
  • 使用cin來(lái)將鍵盤(pán)輸入存儲(chǔ)到string對(duì)象中。
  • 使用cout來(lái)顯示string對(duì)象。
  • 可以使用數(shù)組表示方法來(lái)訪問(wèn)存儲(chǔ)在string1對(duì)象中的字符。

賦值 —— 不能將一個(gè)數(shù)組賦給另一個(gè)數(shù)組,但可以將一個(gè)string對(duì)象賦另一個(gè)string對(duì)象。

char char01[20];                // 創(chuàng)建一個(gè)空列表
char char02[20] = "Jason";      // 創(chuàng)建一個(gè)初始化數(shù)組

string str01;                   // 創(chuàng)建一個(gè)空的string對(duì)象
string str02 = "Soler Ho";      // 創(chuàng)建一個(gè)初始化的string對(duì)象

char01 = char01;                // 不可執(zhí)行,一個(gè)數(shù)組不能賦值給另一個(gè)數(shù)組
str01 = str02;                  // 可執(zhí)行,可將一個(gè)string對(duì)象賦給另一個(gè)string對(duì)象。

3.2 復(fù)制、拼接和附加

string類(lèi)簡(jiǎn)化字符串合并操作。

利用運(yùn)算符 + 將兩個(gè)string對(duì)象合并起來(lái)。

string str01;                  
string str02 = "Soler Ho";

string = str01 + str02;

可以使用運(yùn)算符 += 將字符串附加到string對(duì)象的末尾。

string str01;                  
string str02 = "Soler Ho";

str01 += str02;

4. 結(jié)構(gòu)簡(jiǎn)介

結(jié)構(gòu)是用戶定義的類(lèi)型,而結(jié)構(gòu)聲明定義了類(lèi)型的數(shù)據(jù)屬性。

定義類(lèi)型之后,就直接創(chuàng)建類(lèi)型的變量。

結(jié)構(gòu)比數(shù)組靈活,同一個(gè)結(jié)構(gòu)中可以存儲(chǔ)多種類(lèi)型的數(shù)據(jù)。

4.1 創(chuàng)建結(jié)構(gòu)的步驟:

  • 定義結(jié)構(gòu)描述 —— 描述并標(biāo)記能夠存儲(chǔ)在結(jié)構(gòu)中的各種數(shù)據(jù)類(lèi)型
  • 按描述創(chuàng)建結(jié)構(gòu)變量(結(jié)構(gòu)數(shù)據(jù)對(duì)象)。

4.2 結(jié)構(gòu)的定義:

struct(關(guān)鍵字) 類(lèi)型名(標(biāo)記成為新類(lèi)型的名稱(chēng))
{
    結(jié)構(gòu)成員1;
    結(jié)構(gòu)成員2;
    結(jié)構(gòu)成員3;
};//(結(jié)束結(jié)構(gòu)聲明)

對(duì)于結(jié)構(gòu)中的成員,使用成員運(yùn)算符(.)來(lái)進(jìn)行訪問(wèn)各個(gè)成員。

4.3 結(jié)構(gòu)的初始化(C++11)

與數(shù)組一樣,列表的初始化用于結(jié)構(gòu),且等號(hào)(=)可有可無(wú)

infor Soler_infor {"Soler HO",55,168}; // 在C++11中,= 號(hào)可以省略

如果大括號(hào)內(nèi)未包含任何東西,各個(gè)成員都將設(shè)置為零。

infor Soler_infor {};

不允許縮窄轉(zhuǎn)換

✅ 小Tips:C++允許在聲明結(jié)構(gòu)變量時(shí)省略關(guān)鍵字struct。

4.4 成員賦值

成員賦值(memberwise assignment):可以使用賦值運(yùn)算符(=)將結(jié)構(gòu)賦另一個(gè)同類(lèi)型的結(jié)構(gòu)。這樣結(jié)構(gòu)中的每個(gè)成員都將被設(shè)置為另一個(gè)結(jié)構(gòu)中相應(yīng)成員的值。即使成員是數(shù)組。這種方式就是成員賦值。

5. 共用體

共用體(union),也叫做聯(lián)合(union)。一種 構(gòu)造數(shù)據(jù)類(lèi)型

關(guān)鍵字:union

聯(lián)合(union):將不同類(lèi)型的數(shù)據(jù)在一起共同占用同一段內(nèi)存

存儲(chǔ)不同的數(shù)據(jù)類(lèi)型,但只能同時(shí)存儲(chǔ)其中的一種類(lèi)型

示例:

union sample
{
    int int_val;
    long long_val;
    double double_val;
};

5.1 結(jié)構(gòu)體和共用體的區(qū)別

  • 結(jié)構(gòu)可以同時(shí)存儲(chǔ)int、long和double。
  • 共用體只能存儲(chǔ)int、long和double三種。
  • 含義不同。
  • 關(guān)鍵字不同

結(jié)構(gòu)體:struct

共用體:union

5.2 共用體的用途:

  • 當(dāng)數(shù)據(jù)使用兩種格式或更多格式(但不會(huì)同時(shí)使用)時(shí),可以節(jié)省空間。
  • 嵌入式系統(tǒng)編程(如控制烤箱、MP3播放器),內(nèi)存非常寶貴。

常用于操作系統(tǒng)數(shù)據(jù)結(jié)構(gòu)或硬件數(shù)據(jù)結(jié)構(gòu)。

5.3 匿名共用體

匿名共用體(anonymous union)沒(méi)有名稱(chēng),其成員將成為位于相同地址處的變量。

6. 枚舉

C++的enum工具提供了另一種創(chuàng)建符號(hào)常量的方式,可以代替const,允許定義新類(lèi)型,但必須有嚴(yán)格限制。

使用enum的語(yǔ)法格式與結(jié)構(gòu)的使用類(lèi)似。

enum color{red,orange,yellow,green,blue,voilet};

6.1 設(shè)置枚舉量的值

enum week{Monday = 1,Tuesday = 2;Wednesday = 3;Thursday = 4};

指定的值必須是整數(shù)。也可以只顯示定義其中一些枚舉量的值。

如果第一個(gè)變量未初始化,默認(rèn)為0。后面沒(méi)有被初始化的枚舉量的值將比其前面的枚舉量大1。也可以創(chuàng)建多個(gè)值相同的枚舉量。

enum {zero,null = 0,numero_one,one = 1};

6.2 枚舉的取值范圍

每個(gè)枚舉都有取值范圍的上限,通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換,可以將取值范圍中的任何整數(shù)值賦給枚舉常量,即使這個(gè)值不是枚舉值。

6.3 取值范圍的定義

  • 找出上限,需要知道枚舉量的最大值。

找到大于最大值的,最小的2的冪,減去1,得到就是取值范圍的上限。

  • 計(jì)算下限,知道枚舉量的最小值。

如果不小于0,則取值范圍的下限為0,否則,采用尋找上限方式相同的方式,但是要加上負(fù)號(hào)。

對(duì)于選擇使用多少空間來(lái)存儲(chǔ)枚舉由編譯器決定。

7. 指針和自由空間

對(duì)于地址顯示結(jié)果是十六進(jìn)制表示法,因?yàn)槎际浅3C枋?code>內(nèi)存的表示法。

指針與C++基本原理

面向?qū)ο缶幊毯蛡鹘y(tǒng)的過(guò)程性編程的區(qū)別,OOP強(qiáng)調(diào)的是運(yùn)行階段(而不是編譯階段)進(jìn)行決策。

運(yùn)行階段:程序正在運(yùn)行是,取決于不同的情況。編譯階段:編譯器將程序組合起來(lái)時(shí)。堅(jiān)持原先設(shè)定的安排

指針用于存儲(chǔ)值的地址。指針名表示的是地址。

*運(yùn)算符稱(chēng)為間接值或解除引用運(yùn)算符,將其應(yīng)用于指針,得到該地址處存儲(chǔ)的值。

7.1 聲明和初始化指針

指針的聲明必須指定指向的數(shù)據(jù)的類(lèi)型。

int *p_updates;

*p_updates 的類(lèi)型是int,所以*運(yùn)算符被用于指針,所以p_updates變量必須是指針。

運(yùn)算符*兩邊的空格是可選的。

int *ptr; /*該情況強(qiáng)調(diào):*ptr是一個(gè)int類(lèi)型的值。*/

int* ptr; /*該情況強(qiáng)調(diào):int* 是一種類(lèi)型,指向int的指針。*/

在C++中,int*是一種復(fù)合類(lèi)型,是指向int的指針。

double *tax_ptr;

7.2 指針的危險(xiǎn)

在C++創(chuàng)建指針時(shí),計(jì)算機(jī)將分配用來(lái)存儲(chǔ)地址的內(nèi)存,但是不會(huì)分配用來(lái)存儲(chǔ)指針?biāo)赶虻臄?shù)據(jù)的內(nèi)存

⚠️注意:一定要在對(duì)指針應(yīng)用解除引用運(yùn)算符(*)之前,將指針初始化為一個(gè)確定的、適當(dāng)?shù)?code>地址。

7.3 指針和數(shù)字

整數(shù)可以加減乘除等運(yùn)算,而指針描述的是位置。

C++語(yǔ)言數(shù)字不能作為地址使用,如果要把數(shù)字當(dāng)?shù)刂穪?lái)使用,應(yīng)通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換將數(shù)字轉(zhuǎn)換為適當(dāng)?shù)牡刂奉?lèi)型。

7.4 使用new分配delete釋放內(nèi)存

指針在運(yùn)行階段 分配未命名的內(nèi)存以存儲(chǔ)值。然后使用內(nèi)存來(lái)訪問(wèn)內(nèi)存。

C語(yǔ)言中,使用 庫(kù)函數(shù)malloc()來(lái)分配內(nèi)存。C++中使用 ———— new運(yùn)算符。

7.4.1 要注意使用delete進(jìn)行內(nèi)存的釋放

需要內(nèi)存時(shí),直接使用new來(lái)請(qǐng)求,這是內(nèi)存管理數(shù)據(jù)包的一個(gè)方面。

如果使用了delete運(yùn)算符,使得在使用完內(nèi)存后,能夠?qū)⑵?code>歸還給內(nèi)存池,這是有效使用內(nèi)存的關(guān)鍵。

使用delete時(shí),后面要加上指向內(nèi)存塊的指針。

int * ps = new int; // 使用new進(jìn)行內(nèi)存分配
 ...
delete ps; // 使用delete進(jìn)行內(nèi)存的釋放

⚠️注意點(diǎn):

1.使用delete釋放ps的內(nèi)存,但是不會(huì)刪除指針ps本身。

2.只能用delete來(lái)釋放使用new分配的內(nèi)存,但是如果是空的指針使用delete是安全的。

使用delete的關(guān)鍵:用于new分配的內(nèi)存。不是要使用于new的指針,而是用于new的地址。

❌警告:不能創(chuàng)建兩個(gè)指向同一個(gè)內(nèi)存塊的指針。會(huì)增加錯(cuò)誤地刪除同一個(gè)內(nèi)存塊兩次的可能性。

7.5 使用new創(chuàng)建動(dòng)態(tài)數(shù)組

C++中,創(chuàng)建動(dòng)態(tài)數(shù)組,只需要將數(shù)組的元素類(lèi)型元素?cái)?shù)目告訴new即可。必須在類(lèi)型名后面加上方括號(hào),其中包含了元素?cái)?shù)目。

通用格式:

Type_name *pointer_name = new Type_name[num_element];
//例子
int * psome =new int[10]; // 創(chuàng)建10個(gè)int元素的數(shù)組

new運(yùn)算符會(huì)返回第一個(gè)元素的地址

如果使用完new分配的內(nèi)存,使用delete進(jìn)行內(nèi)存的釋放。

delete [] psome; // 進(jìn)行內(nèi)存的釋放

delete和指針直接的方括號(hào)告訴程序,應(yīng)釋放整個(gè)數(shù)組,不僅僅是指針指向的元素。

delete中的方括號(hào)的有無(wú)取決于使用new時(shí)的方括號(hào)有無(wú)。

對(duì)于指針數(shù)組的使用,直接可以按照普通數(shù)組的使用即可。

7.6 使用new和delete時(shí),要遵循的規(guī)則

  • 不要使用delete來(lái)釋放不是new分配的內(nèi)存。
  • 不要使用delete釋放同一個(gè)內(nèi)存塊兩次。
  • 如果使用new[]為數(shù)組分配內(nèi)存時(shí),則應(yīng)使用delete[]來(lái)釋放。
  • 如果使用new[]為一個(gè)實(shí)體分配內(nèi)存,則應(yīng)使用delete(沒(méi)有方括號(hào))來(lái)釋放。
  • 對(duì)空指針使用delete時(shí)很安全。

8. 指針、數(shù)組和指針?biāo)阈g(shù)

指針和數(shù)組基本等價(jià)的原因:指針?biāo)阈g(shù)(pointer arithmetic)C++ 內(nèi)部處理數(shù)組的方式。

對(duì)整數(shù)變量 + 1,其增加1

對(duì)指針變量 + 1,增加的量等于它指向的類(lèi)型的字節(jié)數(shù)。

獲取數(shù)組地址的兩種方式

double * pw = wages; // 數(shù)組名 = 地址 ;將pw聲明為指向double類(lèi)型的指針。然后將其初始化為wages - - - wages數(shù)組中第一個(gè)元素的地址。

short * ps = &wages[0]; // 使用地址操作;使用地址運(yùn)算符來(lái)將ps指針初始化為stacks數(shù)組的第一個(gè)元素。

8.1 指針問(wèn)題小結(jié)

8.1.1 聲明指針

要聲明指向特定類(lèi)型的指針,語(yǔ)法格式:

TypeName *pointerName;
// 例子
double * pn; // pn 指向一個(gè)double類(lèi)型
char * ps;  // ps 指向一個(gè)char類(lèi)型

8.1.2 給指針賦值

將內(nèi)存地址賦給指針??梢詫?duì)變量名應(yīng)用 & 運(yùn)算符,來(lái)獲得被變量名的內(nèi)存地址,new運(yùn)算符返回未命名的內(nèi)存的地址。

示例:

double * pn;  // pn 指向一個(gè)double類(lèi)型
double * pa; // pa 指向一個(gè)double類(lèi)型

char * pc; // pc 指向一個(gè)char類(lèi)型
double bubble = 3.2; 

pn = &bubble; // 把bubble的地址賦值給 pn
pc = new char; // 新建char地址并分配給pc

8.1.3 對(duì)指針解除引用

對(duì)指針解除引用意味著獲得指針指向的值。

方法1:對(duì)指針應(yīng)用解除引用間接值運(yùn)算符(*)來(lái)解除引用。

cout<<*pn;
*pc = 's';

方法2:使用數(shù)組表示法。不可以對(duì)未初始化為適當(dāng)?shù)刂返闹羔樈獬?/s>。

8.1.4 數(shù)組名

多數(shù)情況下,C++將數(shù)組名視為數(shù)組的第一個(gè)元素的地址

int tacos[10]; // 此時(shí)的tacos同樣也是&tacos[0]

8.1.5 指針?biāo)阈g(shù)

C++中允許指針和整數(shù)相加。加1 的結(jié)果等于原來(lái)的地址值加上指向的對(duì)象占用的總字節(jié)數(shù)。

也可以將一個(gè)指針減去另一個(gè)指針,獲得兩個(gè)指針的差。得到一個(gè)整數(shù),僅當(dāng)兩個(gè)指針指向同一個(gè)數(shù)組(也可以指向超出結(jié)尾的一個(gè)位置)時(shí),這種情況會(huì)得到兩個(gè)元素的間隔。

8.1.6 數(shù)組的動(dòng)態(tài)聯(lián)編和靜態(tài)聯(lián)編

使用數(shù)組聲明來(lái)創(chuàng)建數(shù)組時(shí),將采用靜態(tài)聯(lián)編,即數(shù)組長(zhǎng)度在編譯時(shí)設(shè)置。

int tacos[10] // 靜態(tài)聯(lián)編

使用new[]運(yùn)算符創(chuàng)建數(shù)組時(shí),將采用動(dòng)態(tài)聯(lián)編(動(dòng)態(tài)數(shù)組),即將在運(yùn)行時(shí)為數(shù)組分配空間,其長(zhǎng)度為運(yùn)行時(shí)設(shè)置。

使用這類(lèi)數(shù)組后,要使用delete[]釋放所占用的內(nèi)存。

8.1.7 數(shù)組表示法和指針表示法

使用方括號(hào)數(shù)組表示法等同于對(duì)指針解除引用。

數(shù)組名和指針變量也是一樣。所以對(duì)于指針和數(shù)組名,既可以使用指針表示法,也可以使用數(shù)組表示法。

int * pt = new int [10];
*pt = 5;
pt[0] = 6;
pt[9] = 5;
int coats[10];
*(coats + 4) = 12;

8.2 指針和字符串

數(shù)組名是第一個(gè)元素地址。

如果給cout提供一個(gè)字符的地址,則它將從該字符開(kāi)始打印,直到遇到空字符為止。

在cout和多數(shù)C++表達(dá)式中,char數(shù)組名、char指針以及用引號(hào)括起來(lái)的字符串常量都被解釋為字符串第一個(gè)字符的地址。

不要使用字符串常量或未被初始化的指針來(lái)接收輸入。

在字符串讀入程序時(shí),應(yīng)使用已分配的內(nèi)存地址。該地址不是數(shù)組名,也可以使用new初始化過(guò)的指針。

strcpy()接受兩個(gè)參數(shù),第一個(gè):目標(biāo)地址,第二個(gè):要復(fù)制的字符串的地址。

要確定目標(biāo)空間有足夠的空間來(lái)存儲(chǔ)副本。

8.3 使用new創(chuàng)建動(dòng)態(tài)結(jié)構(gòu)

對(duì)于在指定結(jié)構(gòu)成員時(shí),句點(diǎn)運(yùn)算符箭頭運(yùn)算符的選擇時(shí):

  • 如果結(jié)構(gòu)標(biāo)識(shí)符是結(jié)構(gòu)名,則使用句點(diǎn)運(yùn)算符(.)
  • 如果標(biāo)識(shí)符是指向結(jié)構(gòu)的指針,則使用箭頭運(yùn)算符(->)。

把new用于結(jié)構(gòu)的兩個(gè)步驟

創(chuàng)建結(jié)構(gòu)

要?jiǎng)?chuàng)建結(jié)構(gòu),需要同時(shí)使用結(jié)構(gòu)類(lèi)型和new。

創(chuàng)建訪問(wèn)其成員。

8.4 C++管理數(shù)據(jù)內(nèi)存的方式自動(dòng)存儲(chǔ)

在函數(shù)內(nèi)部定義的常規(guī)變量使用自動(dòng)存儲(chǔ)空間,稱(chēng)為自動(dòng)變量。

只在特定函數(shù)被執(zhí)行時(shí)存在。

自動(dòng)變量時(shí)一個(gè)局部變量,作用域?yàn)榘?code>代碼塊。通常存儲(chǔ)在中,遵循后進(jìn)先出(LIFO)。

  • 靜態(tài)存儲(chǔ)

變量稱(chēng)為靜態(tài)的方式在函數(shù)外面定義在聲明變量時(shí)使用關(guān)鍵字static。

整個(gè)程序執(zhí)行期間都存在的存儲(chǔ)方式(存在于程序的整個(gè)生命周期)。

  • 動(dòng)態(tài)存儲(chǔ)

內(nèi)存池(自由存儲(chǔ)空間或堆)用于靜態(tài)變量和自動(dòng)變量,且內(nèi)存是分開(kāi)的。

  • 線程存儲(chǔ)(C++11特性)

9. 數(shù)組替代品 --- 模板類(lèi)

模板類(lèi)vectorarray是數(shù)組的替代品。

9.1 模板類(lèi)vector

模板類(lèi)vector類(lèi)似于string類(lèi),也是一種動(dòng)態(tài)數(shù)組。

  • vector對(duì)象包含在vector頭文件中。
  • vector包含在名稱(chēng)空間std中,使用using編譯指令using聲明std::vector。
  • 模板使用不同的語(yǔ)法來(lái)指出它存儲(chǔ)的數(shù)據(jù)類(lèi)型
  • vector類(lèi)使用不用的語(yǔ)法來(lái)指定元素?cái)?shù)。

9.2 模板類(lèi)array(C++11)

位于名稱(chēng)空間std中,與數(shù)組一樣,array對(duì)象的長(zhǎng)度固定,也使用棧(靜態(tài)內(nèi)存分配),而不是自由存儲(chǔ)區(qū)。

頭文件 array。

9.3 數(shù)組、vector和array的區(qū)別

無(wú)論是數(shù)組、vector對(duì)象還是array對(duì)象,都可使用標(biāo)準(zhǔn)數(shù)組表示法來(lái)訪問(wèn)各個(gè)元素。

地址可知,array對(duì)象和數(shù)組存儲(chǔ)在相同的內(nèi)存區(qū)域(即棧)中,vector對(duì)象存儲(chǔ)在自由存儲(chǔ)區(qū)域或堆中。

可以將一個(gè)array對(duì)象賦給另一個(gè)array對(duì)象,對(duì)于數(shù)組,必須逐個(gè)元素復(fù)制數(shù)據(jù)。

Github地址:https://github.com/SolerHo/cpp-Primer-Plus-6e-Notes/blob/master/Chapter04/README.md

到此這篇關(guān)于C++ Primer Plus 第四章之C++ Primer Plus復(fù)合類(lèi)型學(xué)習(xí)筆記的文章就介紹到這了,更多相關(guān)C++ Primer Plus復(fù)合類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論