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

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

C++幼兒園[4] - 指針

2019-11-10 20:21:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1.補(bǔ)充

先來(lái)補(bǔ)充一些知識(shí)點(diǎn)

1. 1.更多數(shù)據(jù)類(lèi)型

首先,變量類(lèi)型都可用 signed / unsigned(有符號(hào)/無(wú)符號(hào))來(lái)修飾(除bool) 我們平常直接聲明的 int a,其實(shí)全稱(chēng)為signed int a,其中signed關(guān)鍵字會(huì)默認(rèn)加上,表示可取正,可取負(fù)值 若用unsigned修飾,則表示無(wú)符號(hào),只可取正值,對(duì)應(yīng)的取值范圍會(huì)*2 如 char a范圍:[-128,127] unsigned char a范圍 :[0,255]

另外,int double 都可用 long修飾 或者說(shuō),long可用int 和 double 修飾 short可用int修飾 貴圈略亂,見(jiàn)下

long int i; // 占8字節(jié),范圍:[-2^63,2^63-1]long ii; //與上一句同義long double d; //占10(或8)字節(jié),范圍:超大short int s; //占2字節(jié),范圍多大?short ss; //同上

1.2. 類(lèi)型轉(zhuǎn)換

在將高精度/大范圍的類(lèi)型轉(zhuǎn)換為低精度/小范圍的變量時(shí),會(huì)發(fā)生精度降低,數(shù)據(jù)丟失的情況

int a; double b = 1.25; a = b; //或者直接寫(xiě)a=1.25 cout << a; // 結(jié)果為1

注意,計(jì)算機(jī)中精度降低并不是四舍五入,而是數(shù)據(jù)直接舍棄,所以這里只保留整數(shù)部分

如果他們的取值范圍差很多,就會(huì)出現(xiàn)溢出的情況

int a = 9999; char c = a;

上面的例子里,如果直接cout<<c,會(huì)輸出一個(gè)字符 可以用斷點(diǎn)調(diào)試的方法來(lái)看c的值。 調(diào)試查看char型數(shù)據(jù)的值 加上斷點(diǎn),在執(zhí)行了對(duì)c賦值的語(yǔ)句之后,將鼠標(biāo)移到c上,懸停,顯示c的值為15。

與之前相反,如果將int轉(zhuǎn)為long,不會(huì)發(fā)生精度降低的情況。

以上的類(lèi)型轉(zhuǎn)換都是隱式進(jìn)行的,與強(qiáng)制類(lèi)型轉(zhuǎn)換相對(duì)

//沒(méi)有強(qiáng)制類(lèi)型轉(zhuǎn)換 double a = 5 / 2; //5和2都是整數(shù),默認(rèn)結(jié)果為int型,結(jié)果為2 double p= 5.0 / 2; //運(yùn)算式中有一個(gè)double,結(jié)果就默認(rèn)為double// 強(qiáng)制轉(zhuǎn)換:數(shù)據(jù)類(lèi)型 (變量) double b = double(5) / 2; //b=2.5。將5轉(zhuǎn)換為了double,結(jié)果默認(rèn)為double double c = 5 / double(2); //c=2.5//強(qiáng)制轉(zhuǎn)換:(數(shù)據(jù)類(lèi)型) 變量 double d = (int)2.5; //d=2 double e = (int)5 / 2.0; //e=2.5。int只結(jié)合了5,int/double 結(jié)果為double double f = (int)(5 / 2.0); // f=2

以上int和double也代表了精度的相對(duì)高低,即float/int ,double/short 都有相同的效果

1.3. 邏輯運(yùn)算符

好像我還沒(méi)講過(guò)啊,不過(guò)你們應(yīng)該都會(huì)

|| 或(or) && 與(and) ! 非(not)

他們都對(duì)布爾型的量起作用 比如 false||true結(jié)果為true false&&true結(jié)果為false !false為true

bool a= !9;if(a || false && true){ cout << a;}

1.4. sizeof函數(shù)

不需include iostream即可使用

它return參數(shù)所占地址的大小,單位字節(jié) 參數(shù)可以是變量、數(shù)據(jù)類(lèi)型

#include <iostream>using namespace std;void main(){ int a = 123456; cout << sizeof(a) << endl; cout << sizeof(int) << endl; cout << sizeof(double) << endl;}

1.5. char型數(shù)組

它有一些特殊的地方,所以還是單獨(dú)拿出來(lái)說(shuō)一下

用char表示一個(gè)字母 char數(shù)組就表示一組字母了

void main(){ char k[3]; k[0] = 'k'; char a[3] = { 'k','d','g' }; //用單引號(hào)引起來(lái)的char來(lái)組成數(shù)組// char b[3] = { "kdg" }; //不行? char c[3] = "kd"; //又行了? char d[] = "cppkdg"; cout << a[2] << endl; for (int i = 0; i < 20; i++) { cout << d[i]; //輸出了什么? }}

再來(lái)試驗(yàn)一下

void main(){ char c[] = "cppkdg cpp/0kdg"; cout << c;}

得出結(jié)論,用""引起來(lái)的字符串,以/0作為結(jié)尾符號(hào),且占1字節(jié)

1.6. 優(yōu)雅地使用函數(shù)

函數(shù)的一個(gè)好處就是讓程序分塊了 比如做一道菜cook(),我們有幾個(gè)步驟 wash()洗菜 oil() 放油 fry() 翻炒 而fry()的過(guò)程中又要調(diào)節(jié)火候adjustFire()和放鹽salt() 這個(gè)程序大概就長(zhǎng)這樣

void wash() { cout << "洗菜"; }void oil() { cout << "放油"; }void salt() { cout << "放了鹽"; }void ajustFire() { cout << "調(diào)整火"; }void fry(){ ajustFire(); //注意,C++不能在函數(shù)中定義函數(shù),只能調(diào)用 salt();}void cook(){ wash(); oil(); fry();}

每個(gè)函數(shù)都只做一件事,這件事就是它的名字。 下次別人要用你的程序炒菜,他光看名字就知道每個(gè)函數(shù)是干什么的,就能節(jié)約很多時(shí)間,創(chuàng)造出屬于他的myCook()函數(shù),美滋滋

函數(shù)的另一個(gè)好處是提高了代碼的重用性 例如上面的salt(),只用寫(xiě)一遍,就可以在其他地方隨意使用了(當(dāng)然實(shí)際情況,需要加上一些參數(shù))

2. 指針與地址

進(jìn)入正題

2.1. 地址

變量在內(nèi)存中存儲(chǔ)的位置就是他們的地址。 我們所說(shuō)的32位/64位系統(tǒng),內(nèi)存的地址就有32/64bits,一般用十六進(jìn)制表示。 我們平常所寫(xiě)的win32程序,地址就是一個(gè)8位的,十六進(jìn)制數(shù)字 像是0XFFFFFF

先介紹一下取地址運(yùn)算符& 它有兩種作用(當(dāng)然,第3種,做位運(yùn)算,bit Operation用,暫不介紹) 寫(xiě)在等號(hào)左邊時(shí),表示引用 (閱讀下面的教程) http://www.runoob.com/cplusplus/cpp-references.html

寫(xiě)在等號(hào)右邊時(shí),表示取……的地址

int a = 13548; cout << &a; //輸出看看,我這里的結(jié)果是00AFF9C4

所說(shuō)的“等號(hào)”左邊右邊是一個(gè)形象的說(shuō)法 等號(hào)左邊:聲明、定義一個(gè)變量/給一個(gè)變量賦值,稱(chēng)為左值 等號(hào)右邊:某運(yùn)算,稱(chēng)為右值

對(duì)右值做的操作,并不會(huì)影響原變量 比如上面將的類(lèi)型強(qiáng)制轉(zhuǎn)換

double a = 2.5;int i = (int)a;cout<< i<< " "<< a;

原來(lái)的a并沒(méi)有被強(qiáng)制轉(zhuǎn)換成int,只是a的值賦給i的時(shí)候,是當(dāng)做int的

2.2. 指針(pointer, ptr, p)

閱讀下面的教程,對(duì)指針有個(gè)初步的了解 http://www.runoob.com/cplusplus/cpp-pointers.html

總結(jié)一下 今有int a=123;int *p = &a; 或分開(kāi)寫(xiě),int *p; p = &a; 此時(shí)p是變量a的地址 *p是p的“值的值”,即p所代表的地址的值,即a,即123 對(duì)p的操作會(huì)影響a 與&取地址對(duì)應(yīng),*就是取值號(hào)

引用一段書(shū)上的話

指針是“危險(xiǎn)”的,如果未對(duì)它進(jìn)行初始化,它就指向計(jì)算機(jī)里的一個(gè)隨機(jī)地址,這個(gè)地址可能是一些重要的數(shù)據(jù)或程序代碼,如果盲目去訪問(wèn),可能會(huì)對(duì)系統(tǒng)造成很大的危害,因此指針變量在使用之前必須有確定的指向,應(yīng)先賦值后再引用。

指針最常用的情況: 通過(guò)指針改變?cè)兞康闹?記得上次說(shuō)過(guò)形參和實(shí)參的問(wèn)題

void swap(int a,int b) //交換兩個(gè)值{ int temp = b; b = a; a = temp;}void main(){ int a = 1; int b = 2; swap(a, b); //這樣無(wú)法交換main函數(shù)中a,b的值}

以及…補(bǔ)充一點(diǎn)…調(diào)用的時(shí)候,swap(a,b),就相當(dāng)于給swap函數(shù)傳進(jìn)去了兩個(gè)可以被使用的值,理解為swap(int a=a, int b=b),等號(hào)左邊是形參,名字可以被任意更改。 比如我定義

void swap(int num1, int num2) { ;}

調(diào)用時(shí),可以想象成num1=a, num2=b,然后在函數(shù)內(nèi)對(duì)num1和num2做各種改變

可以用指針來(lái)達(dá)到交換的效果。 http://www.runoob.com/cplusplus/cpp-passing-pointers-to-functions.html 閱讀上面的教程,想想怎么實(shí)現(xiàn)變量交換

其實(shí)平常用的數(shù)組,變量的名字,就表示地址

#include <iostream>using namespace std;void main(){ int a[] = { 10,2,3 }; int *p = a; //a就是地址,所以不用&符號(hào)了 cout << a << endl;// a = a + 1; //錯(cuò)誤,a不可變 cout << p << " " << p + 1 << endl; p = p + 1; //可以,p表示的地址可變 cout << *p << " " << *(p + 1) << endl;}

通過(guò)以上程序,我們發(fā)現(xiàn),可對(duì)地址用運(yùn)算符號(hào),“地址+1”得到相鄰的地址,而數(shù)組就是一組地址相鄰的數(shù),所以數(shù)組第n個(gè)元素地址+1得到第n+1個(gè)元素的地址。 也發(fā)現(xiàn)了,數(shù)組名字表示的地址,是該數(shù)組第0個(gè)數(shù)的地址,即*p為10

所以,我們用的a[1]其實(shí)就是*(a+1)!也許[]就是為了簡(jiǎn)化指針呢

貼個(gè)教程加強(qiáng)理解,指針與數(shù)組 http://www.runoob.com/cplusplus/cpp-pointers-vs-arrays.html

以上是指針的基礎(chǔ)知識(shí),下面幾個(gè)點(diǎn)比較容易弄混,搞不懂的多百度+實(shí)踐

int *p 可以指向一個(gè)數(shù)組,即p表示了數(shù)組首元素的地址 那么,int (*p)[4]是什么? 指針數(shù)組。它是一組指針

int **p是什么? 二重指針。常用來(lái)指向一個(gè)指針數(shù)組,而每個(gè)一重指針指向一個(gè)數(shù)組(可以是多維)。可以有更多的指針?lè)?hào),int ****p,就是一個(gè)多重指針,不過(guò)基本不用

很有必要的空指針 http://www.runoob.com/cplusplus/cpp-null-pointers.html

下面這篇加深理解(概念還是很重要的,但貌似下學(xué)期課程并不會(huì)講?) 指針與引用的區(qū)分,參數(shù)傳遞 http://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html 上面這篇可能有些難以理解,不懂的多問(wèn)

2.3. 動(dòng)態(tài)數(shù)組

之前大家都應(yīng)該試過(guò),

int x;cin>> x;int a[x];

是錯(cuò)誤的

那我們?cè)趺磥?lái)定義一個(gè)長(zhǎng)度取決于用戶需要的數(shù)組?

int x; cin >> x; int *a = new int[x]; //第一步,申請(qǐng)一片連續(xù)的內(nèi)存空間/** ...* 正常地使用該數(shù)組*/ delete[] a; //第二步,釋放內(nèi)存地址,否則會(huì)內(nèi)存泄漏 a = NULL; //第三步,指針置空

上面三步都是不可少的,第三步最容易被忘掉

它們的原理:https://zhidao.baidu.com/question/1511589718638971140.html


以上就是這次要講的內(nèi)容,由于指針是C++入門(mén)的重難點(diǎn),內(nèi)容較多(貼了很多文章),難度較大,所以有什么看不懂/查不到的,多問(wèn)。

作業(yè)(要交):

將之前的作業(yè)“數(shù)組排序”寫(xiě)成2個(gè)函數(shù),用2種不同的方法排序(推薦冒泡排序和選擇排序,其他也可),并在main中調(diào)用 要求:將輸入的數(shù)組排序,也就是調(diào)用了sort(a)后,a變成有序數(shù)組 傳入:一個(gè)int型數(shù)組(或指針、地址等),長(zhǎng)度length 返回:空 提示:用指針、地址的相關(guān)知識(shí)和sizeof函數(shù)(求長(zhǎng)度length)

寫(xiě)一個(gè)函數(shù),交換兩個(gè)int型變量,返回為空

寫(xiě)一個(gè)函數(shù),計(jì)算字符串長(zhǎng)度 傳入:一個(gè)字符串(char型數(shù)組),不要用string,形參不能是數(shù)組 返回:長(zhǎng)度,不計(jì)末尾的/0

寫(xiě)一個(gè)函數(shù),將一個(gè)字符串(b)拼接到另一個(gè)字符串(a)末尾,并能讓改變影響原數(shù)組 傳入:兩個(gè)字符串(char型數(shù)組),不要用string,形參不能是數(shù)組 返回:空 提示:注意a的長(zhǎng)度,以及結(jié)束符/0

寫(xiě)一個(gè)函數(shù),反轉(zhuǎn)字符串。即abcd變成dcba,要求同上,注意結(jié)束符

第一題的參考和解析:http://c.biancheng.net/cpp/biancheng/view/43.html


上一篇:C++ STL

下一篇:JAVA和C++區(qū)別

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

圖片精選

主站蜘蛛池模板: 华池县| 萨迦县| 依安县| 绥江县| 万源市| 廉江市| 西和县| 台中市| 涞水县| 开原市| 丽江市| 略阳县| 郁南县| 延川县| 嘉善县| 扶风县| 文成县| 双流县| 白山市| 衡东县| 西和县| 五家渠市| 会昌县| 九龙坡区| 贺兰县| 板桥市| 昂仁县| 札达县| 义马市| 诸城市| 时尚| 洛川县| 武汉市| 山西省| 阜康市| 峨边| 连南| 曲松县| 南澳县| 汝南县| 阿巴嘎旗|