国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++入門(2)——指針

2019-11-06 06:57:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

地址

計(jì)算機(jī)程序在存儲(chǔ)數(shù)據(jù)時(shí)必須跟蹤以下3個(gè)屬性

信息存儲(chǔ)在何處存儲(chǔ)的值為多少存儲(chǔ)的信息是什么類型 之前我們使用過(guò)另一種策略來(lái)達(dá)到上述目的:定義一個(gè)簡(jiǎn)單變量,聲明語(yǔ)句指出了值的類型和符號(hào)名,還讓程序?yàn)橹捣峙鋬?nèi)存,并在內(nèi)部跟蹤該內(nèi)存單元 下面來(lái)看另一種策略,它在開(kāi)發(fā)C++類時(shí)非常重要。這種策略以指針為基礎(chǔ),指針是一個(gè)變量,其存儲(chǔ)的是值的地址,而不是值本身。在討論指針之前,我們先看一看如何找到常規(guī)變量的地址。只需要對(duì)變量應(yīng)用地址運(yùn)算符&, 就可以獲得它的位置 #include <iostream> int main() { using namespace std; int a = 6; double b = 4.5; cout << "a value = " << a; cout << " and a address is " << &a << endl; cout << "b value = " << b; cout << " and b address is " << &b << endl; return 0; }

輸出如下,顯示地址時(shí),該實(shí)現(xiàn)的cout使用十六進(jìn)制法,因?yàn)檫@時(shí)常用于描述內(nèi)存的表示法。

a value = 6 and a address is 0x7ffedf68996cb value = 4.5 and b address is 0x7ffedf689970

指針與C++基本原理

面向?qū)ο?OOP)與傳統(tǒng)過(guò)程性編程的區(qū)別在于,OOP強(qiáng)調(diào)的是在運(yùn)行階段決策,這樣更靈活。如在C++中聲明數(shù)組,必須指定數(shù)組長(zhǎng)度,這就是編譯階段決策。而下文就就會(huì)提到,C++通過(guò)OOP使用關(guān)鍵字new請(qǐng)求正確數(shù)量正確的內(nèi)存以及使用指針表來(lái)跟蹤新分配的內(nèi)存的位置。

#include <iostream> int main() { using namespace std; int updates = 6; // declare a variable int * p_updates; // declare pointer to an int p_updates = &updates; // assign address of int to pointer //exPRess values two ways cout << "Values: updates = " << updates; cout << ", *p_updates = " << *p_updates << endl; //express values two ways cout << "Addresses: &upadates = " << &updates; cout << ", p_updates = " << updates << endl; //use pointer to change value *p_updates = *p_updates + 1; cout << "Now updates = " << updates << endl; return 0; }

輸出如下,從中可以知道int變量updates和指針變量p_updates 只不過(guò)是同一枚硬幣的兩面。變量updates表示值,并使用& 運(yùn)算符來(lái)獲得地址: 而變量p_updates表示地址,并使用*運(yùn)算符來(lái)獲得值。由于p_updates指向updates,因此*updates 和updates完全等價(jià)(譯者注: 如果覺(jué)得這里有點(diǎn)繞,先把指針當(dāng)作語(yǔ)法糖,后面的文章會(huì)詳細(xì)介紹)。

Values: updates = 6, *p_updates = 6Addresses: &upadates = 0x7fffa344041c, p_updates = 6Now updates = 7

聲明和初始化指針

計(jì)算機(jī)需要跟蹤指針指向的值的類型,因此在指針聲明時(shí)必須指定指針指向的數(shù)據(jù)的類型,例如

int *p_updates

需要注意的是,對(duì)每個(gè)指針變量名,都需要使用一個(gè)*

int *p1, p2;

如果這樣聲明,就創(chuàng)建一個(gè)指針p1和一個(gè)int變量p2。(譯者注:p1前面的int,不代表p1是一個(gè)int。指針和數(shù)組一樣,都是基于其他類型的) 可以在聲明語(yǔ)句中初始化指針

#include <iostream> int main() { using namespace std; int a = 5; int *pointer = &a; cout << a <<"; address = "<< &a << endl; cout << *pointer <<"; value of pointer = "<< pointer << endl; return 0; }

輸出如下

5; address = 0x7ffccfb23a2c 5; value of pointer = 0x7ffccfb23a2c

可以看出,程序?qū)?code>pointer 初始化為變量a的地址。注意: 在不同的系統(tǒng)上,顯示的地址可能不同,顯示格式也可能不同,這里僅供參考。

指針的危險(xiǎn)

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

long * fellow; // create a pointer to long *fellow = 233333;

fellow確實(shí)是一個(gè)指針,但上述代碼沒(méi)有將地址賦值給fellow,那么233333將被放在哪里呢?我們不知道,由于fellow沒(méi)有被初始化,它可能有任何值。不管值是什么,程序都將它解釋為存儲(chǔ)233333的地址,如果fellow的值碰巧為1200,計(jì)算機(jī)將把數(shù)據(jù)放在地址1200上,即使這恰巧是程序代碼的地址。這種錯(cuò)誤可能導(dǎo)致一些最隱匿的錯(cuò)誤


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 芮城县| 聂荣县| 罗源县| 临桂县| 休宁县| 长汀县| 绩溪县| 枝江市| 滨州市| 维西| 兴宁市| 临海市| 潼关县| 固始县| 昌邑市| 平阳县| 旌德县| 南郑县| 柳江县| 万全县| 沁源县| 塔城市| 读书| 蓬溪县| 利辛县| 元江| 仙居县| 龙里县| 新巴尔虎左旗| 澄城县| 宣威市| 耿马| 双柏县| 宣化县| 永寿县| 定陶县| 重庆市| 邵阳县| 虎林市| 甘肃省| 凌海市|