[cpp]
#include<iostream>
using namespace std;
int main(void)
{
/***********************************************************
指針,內存地址,指針取值,指針是啥
指針是一個存儲計算機內存地址的變量。 這裡引用是計算機內存地址。
從指針指向的內存讀取數據叫:指針取值。
指針可以為void類型,也可以是其他的內置數據類型等。
也有NULL指針和未初始化指針。
“*”操作符可以用來聲明一個指針變量,也可以是解引用操作符,當然也可以是
乘法操作符。
“&”是地址操作符。 通過在變量前加上&我們可以得到這個變量的地址
***********************************************************/
int *ptr; //聲明一個int類型的指針
int value = 1;//聲明一個int類型的值,值為1
ptr = &value;//給指針分配一個int類型的值的引用
int *p = ptr;//對指針進行取值,這裡可以直接獲得指針指向的內存地址中的數據
cout << p << endl;
/******************************************************************
類比一下,指針比作信封 引用比作郵箱 值比作房子
ok,我們在信封上面寫上郵寄的地址(引用地址), 我們來取值就相當於地址
對應的房子。我們也可以把信封上的地址塗掉,然後寫上其他的我們想要的地址
房子是在哪裡不動的,所以不受影響。
*******************************************************************/
/*********************************************************************
下面是void指針 NULL指針 未初始化指針
*********************************************************************/
int *ptrs;//未初始化
int *ptring = NULL;//NULL指針
void *vptr;//void指針 未初始化
int *iptr;
int *vastptr;
//void類型可以存儲任意類型的指針或者引用
iptr = &value;
vptr = &value;
cout << iptr << vptr << endl;
//顯示類型轉換 把一個void指針轉換成int指針,並取值。
vastptr = static_cast<int*>(vptr); //(int*)vptr;
cout << *vastptr << endl;
//cout << ptrs << ptring << endl;
/******************************************************************
要知道,未初始化的指針也是有內存地址的,但是是一個垃圾地址。
所以我們不能對未初始化的指針取值。
最好的情況是你去到的是垃圾地址,接下來你需要對程序進行調試
最壞情況就會導致程序崩潰。
*******************************************************************/
/********************************************************************
數組是一斷連續的內存空間,來存儲多個特定類型的對象。
指針用來存儲單個內存地址
所以數組和指針不是相同的結構,不能互相轉換。
數組變量是一個常量,就算指針變量指向相同的地址或者一個不同的數組,
也不能把指針賦值給數組變量。
我們可以把數組變量賦值給指針時,世界上把指向數組第一個元素的地址賦值給指針。
要注意的是:指針需要和數組元素類型保持一致,除非指針是void類型。
********************************************************************/
int myarray[4] = {1, 2, 3, 0};
int *ptrarray = myarray;//*ptrarray = &myarray[0];
cout << *ptr << endl;
//ok上面的操作時正確的。來看下面的錯誤
//myarray = ptrarray;
//myarray = myarrays;
//myarray = &myarrays[0];
/*******************************************************************
結構體和指針。 與數組類似,指向結構體的指針存儲了結構體第一個元素的
內存地址。 結構體的指針必須聲明和結構體類型保持一致 或者為void
*******************************************************************/
struct person{
int age;
char *name;
};
struct person first;
struct person *ptrstruct;
first.age = 22;
char *fullname = "full name";
first.name = fullname;
ptrstruct = &first;
cout << first.age << ptrstruct->name << endl;
return 0;
}
看運行結果:
2012/9/27