1. 程式人生 > >C++編程基礎一 16-指針

C++編程基礎一 16-指針

兩個 默認 urn 定義 cli style 概念 應用 系統默認

 1 // 16-指針.cpp: 定義控制臺應用程序的入口點。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include <climits>
 7 
 8 using namespace std;
 9 
10 int main()
11 {
12 
13     int a = 10; //定義變量後,系統默認會給變量分配一個地址。
14     float b = 9.7f; //將double數據存儲在float類型中有可能會遇到數據太大存不下報錯。寫成9.7f。
15     int c = 20;
16
//怎麽取得變量的內存地址呢? 17 //&取得一個變量的內存地址 18 cout << &a << endl; //取得a變量的內存地址。 19 cout << &b << endl; 20 //*從內存地址所對應的內存處取得數據。 21 cout << *(&a) << endl; 22 23 //取地址的時候用&加上變量,取數據時用*加上地址。 24 //對於一個變量(數據)來說在內存中有兩個東西,一個是它的內存地址,一個是它的值。 25
26 //指針用來存地址的,分不同的類型,因為不同類型所占的內存空間不同。 27 int* pa = &a;//定義一個int類型的指針,並存儲a的地址。 28 float* pb = &b;//定義一個float類型的指針,並存儲b的地址。 29 cout << pa << endl; 30 cout << pb << endl; 31 32 //通過指針訪問數據。 33 cout <<*pa << endl; 34 cout <<*pa << endl;
35 36 int* p; 37 p = pa; //將pa的地址給p。 38 cout << *p << endl; 39 cout << *pa << endl; 40 41 *pa = 100;//將pa地址的值改成100;pa地址對應變量a,看下a中的值是否已經修改! 42 cout << a <<" "<<*pa<<endl; //都是100 43 44 *p = 300; 45 cout << a << " " << *pa << " " << *p << endl;//前面p=pa,將p和pa的地址等效了。感覺和變量的賦值是有區別的。 46 47 //更新後的C++指針必須要初始化的。可以先給個空。 48 int* p1 = 0; //表示指向空。 49 int* p2 = NULL;//表示指向空。 50 int* p3 = nullptr;//C++11中使用的指向空的方式,推薦使用。 51 cout << p1 << " " << p2 << endl; 52 53 //空類型的指針。 54 void * q; //q可以接收任意類型的地址。 55 q =&a; //雖然&a的值是int類型,但是將a的地址給q後,q還是任意類型的指針。這裏和auto不是一個概念。 56 //q = &b 57 //cout << *q << endl; //錯誤寫法,由於q是任意類型的指針,系統不知道需要多大的地址,所以無法輸出q指針 58 //需要先進行類型轉換 59 cout << *((int*)q) <<endl; //(int*)是將任意類型的p指針轉換成int類型的指針,再 *((int*)p)得到指針對用的值。 60 61 //————————通過new申請內存和 通過delete釋放內存———————— 62 63 //int* s = nullptr; //定義並初始化一個int類型的指針。 64 int* s = new int; //定義一個int類型的指針並自己開辟一個int類型的內存空間。 65 *s = 100; //給指針s對應的地址的值賦值100 66 cout << *s << endl; //由於這塊內存地址沒有變量的設定,所以只能通過指針進行訪問。 67 68 //變量的值和變量的地址的區別? 69 //變量地址是房間的號碼,而變量的值是房間裏的東西。可以通過變量取得房間裏東西,也可以通過指針取得房間裏的東西。指針裏存著房間的號碼。 70 71 //new出來的內存區域不用了一定要用delete釋放掉。通過變量申請到的內存是自動釋放的。 72 delete s; //delete+指針名。 73 74 int t; 75 cin >> t; 76 return 0; 77 }

C++編程基礎一 16-指針