先來補充一些知識點
首先,變量類型都可用 signed / unsigned(有符號/無符號)來修飾(除bool) 我們平常直接聲明的 int a,其實全稱為signed int a,其中signed關鍵字會默認加上,表示可取正,可取負值 若用unsigned修飾,則表示無符號,只可取正值,對應的取值范圍會*2 如 char a范圍:[-128,127] unsigned char a范圍 :[0,255]
另外,int double 都可用 long修飾 或者說,long可用int 和 double 修飾 short可用int修飾 貴圈略亂,見下
在將高精度/大范圍的類型轉換為低精度/小范圍的變量時,會發生精度降低,數據丟失的情況
int a; double b = 1.25; a = b; //或者直接寫a=1.25 cout << a; // 結果為1注意,計算機中精度降低并不是四舍五入,而是數據直接舍棄,所以這里只保留整數部分
如果他們的取值范圍差很多,就會出現溢出的情況
int a = 9999; char c = a;上面的例子里,如果直接cout<<c,會輸出一個字符 可以用斷點調試的方法來看c的值。
加上斷點,在執行了對c賦值的語句之后,將鼠標移到c上,懸停,顯示c的值為15。
與之前相反,如果將int轉為long,不會發生精度降低的情況。
以上的類型轉換都是隱式進行的,與強制類型轉換相對
//沒有強制類型轉換 double a = 5 / 2; //5和2都是整數,默認結果為int型,結果為2 double p= 5.0 / 2; //運算式中有一個double,結果就默認為double// 強制轉換:數據類型 (變量) double b = double(5) / 2; //b=2.5。將5轉換為了double,結果默認為double double c = 5 / double(2); //c=2.5//強制轉換:(數據類型) 變量 double d = (int)2.5; //d=2 double e = (int)5 / 2.0; //e=2.5。int只結合了5,int/double 結果為double double f = (int)(5 / 2.0); // f=2以上int和double也代表了精度的相對高低,即float/int ,double/short 都有相同的效果
好像我還沒講過啊,不過你們應該都會
|| 或(or) && 與(and) ! 非(not)
他們都對布爾型的量起作用 比如 false||true結果為true false&&true結果為false !false為true
不需include iostream即可使用
它return參數所占地址的大小,單位字節 參數可以是變量、數據類型
#include <iostream>using namespace std;void main(){ int a = 123456; cout << sizeof(a) << endl; cout << sizeof(int) << endl; cout << sizeof(double) << endl;}它有一些特殊的地方,所以還是單獨拿出來說一下
用char表示一個字母 char數組就表示一組字母了
void main(){ char k[3]; k[0] = 'k'; char a[3] = { 'k','d','g' }; //用單引號引起來的char來組成數組// 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]; //輸出了什么? }}再來試驗一下
void main(){ char c[] = "cppkdg cpp/0kdg"; cout << c;}得出結論,用""引起來的字符串,以/0作為結尾符號,且占1字節
函數的一個好處就是讓程序分塊了 比如做一道菜cook(),我們有幾個步驟 wash()洗菜 oil() 放油 fry() 翻炒 而fry()的過程中又要調節火候adjustFire()和放鹽salt() 這個程序大概就長這樣
每個函數都只做一件事,這件事就是它的名字。 下次別人要用你的程序炒菜,他光看名字就知道每個函數是干什么的,就能節約很多時間,創造出屬于他的myCook()函數,美滋滋
函數的另一個好處是提高了代碼的重用性 例如上面的salt(),只用寫一遍,就可以在其他地方隨意使用了(當然實際情況,需要加上一些參數)
進入正題
變量在內存中存儲的位置就是他們的地址。 我們所說的32位/64位系統,內存的地址就有32/64bits,一般用十六進制表示。 我們平常所寫的win32程序,地址就是一個8位的,十六進制數字 像是0XFFFFFF
先介紹一下取地址運算符& 它有兩種作用(當然,第3種,做位運算,bit Operation用,暫不介紹) 寫在等號左邊時,表示引用 (閱讀下面的教程) http://www.runoob.com/cplusplus/cpp-references.html
寫在等號右邊時,表示取……的地址
int a = 13548; cout << &a; //輸出看看,我這里的結果是00AFF9C4所說的“等號”左邊右邊是一個形象的說法 等號左邊:聲明、定義一個變量/給一個變量賦值,稱為左值 等號右邊:某運算值,稱為右值
對右值做的操作,并不會影響原變量 比如上面將的類型強制轉換
double a = 2.5;int i = (int)a;cout<< i<< " "<< a;原來的a并沒有被強制轉換成int,只是a的值賦給i的時候,是當做int的
閱讀下面的教程,對指針有個初步的了解 http://www.runoob.com/cplusplus/cpp-pointers.html
總結一下 今有int a=123; 令int *p = &a; 或分開寫,int *p; p = &a; 此時p是變量a的地址 *p是p的“值的值”,即p所代表的地址的值,即a,即123 對p的操作會影響a 與&取地址對應,*就是取值號
引用一段書上的話
指針是“危險”的,如果未對它進行初始化,它就指向計算機里的一個隨機地址,這個地址可能是一些重要的數據或程序代碼,如果盲目去訪問,可能會對系統造成很大的危害,因此指針變量在使用之前必須有確定的指向,應先賦值后再引用。
指針最常用的情況: 通過指針改變原變量的值 記得上次說過形參和實參的問題
void swap(int a,int b) //交換兩個值{ int temp = b; b = a; a = temp;}void main(){ int a = 1; int b = 2; swap(a, b); //這樣無法交換main函數中a,b的值}以及…補充一點…調用的時候,swap(a,b),就相當于給swap函數傳進去了兩個可以被使用的值,理解為swap(int a=a, int b=b),等號左邊是形參,名字可以被任意更改。 比如我定義
void swap(int num1, int num2) { ;}調用時,可以想象成num1=a, num2=b,然后在函數內對num1和num2做各種改變
可以用指針來達到交換的效果。 http://www.runoob.com/cplusplus/cpp-passing-pointers-to-functions.html 閱讀上面的教程,想想怎么實現變量交換
其實平常用的數組,變量的名字,就表示地址
#include <iostream>using namespace std;void main(){ int a[] = { 10,2,3 }; int *p = a; //a就是地址,所以不用&符號了 cout << a << endl;// a = a + 1; //錯誤,a不可變 cout << p << " " << p + 1 << endl; p = p + 1; //可以,p表示的地址可變 cout << *p << " " << *(p + 1) << endl;}通過以上程序,我們發現,可對地址用運算符號,“地址+1”得到相鄰的地址,而數組就是一組地址相鄰的數,所以數組第n個元素地址+1得到第n+1個元素的地址。 也發現了,數組名字表示的地址,是該數組第0個數的地址,即*p為10
所以,我們用的a[1]其實就是*(a+1)!也許[]就是為了簡化指針呢
貼個教程加強理解,指針與數組 http://www.runoob.com/cplusplus/cpp-pointers-vs-arrays.html
以上是指針的基礎知識,下面幾個點比較容易弄混,搞不懂的多百度+實踐
int *p 可以指向一個數組,即p表示了數組首元素的地址 那么,int (*p)[4]是什么? 指針數組。它是一組指針
int **p是什么? 二重指針。常用來指向一個指針數組,而每個一重指針指向一個數組(可以是多維)。可以有更多的指針符號,int ****p,就是一個多重指針,不過基本不用
很有必要的空指針 http://www.runoob.com/cplusplus/cpp-null-pointers.html
下面這篇加深理解(概念還是很重要的,但貌似下學期課程并不會講?) 指針與引用的區分,參數傳遞 http://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html 上面這篇可能有些難以理解,不懂的多問
之前大家都應該試過,
int x;cin>> x;int a[x];是錯誤的
那我們怎么來定義一個長度取決于用戶需要的數組?
int x; cin >> x; int *a = new int[x]; //第一步,申請一片連續的內存空間/** ...* 正常地使用該數組*/ delete[] a; //第二步,釋放內存地址,否則會內存泄漏 a = NULL; //第三步,指針置空上面三步都是不可少的,第三步最容易被忘掉
它們的原理:https://zhidao.baidu.com/question/1511589718638971140.html
以上就是這次要講的內容,由于指針是C++入門的重難點,內容較多(貼了很多文章),難度較大,所以有什么看不懂/查不到的,多問。
作業(要交):
將之前的作業“數組排序”寫成2個函數,用2種不同的方法排序(推薦冒泡排序和選擇排序,其他也可),并在main中調用 要求:將輸入的數組排序,也就是調用了sort(a)后,a變成有序數組 傳入:一個int型數組(或指針、地址等),長度length 返回:空 提示:用指針、地址的相關知識和sizeof函數(求長度length)
寫一個函數,交換兩個int型變量,返回為空
寫一個函數,計算字符串長度 傳入:一個字符串(char型數組),不要用string,形參不能是數組 返回:長度,不計末尾的/0
寫一個函數,將一個字符串(b)拼接到另一個字符串(a)末尾,并能讓改變影響原數組 傳入:兩個字符串(char型數組),不要用string,形參不能是數組 返回:空 提示:注意a的長度,以及結束符/0
寫一個函數,反轉字符串。即abcd變成dcba,要求同上,注意結束符第一題的參考和解析:http://c.biancheng.net/cpp/biancheng/view/43.html
新聞熱點
疑難解答
圖片精選