在區分兩個概論前先了解“存儲程序”概念:
世界上的第一臺電子計算機的程序是通過扳動開關和插撥電線實現的,自然,這樣操作費時費力且無法實現自動化。後來馮諾依曼提出了“存儲程序”的概念:把程序(指令序列)存儲到一個存儲器中,程序執行過程中產生的數據也同樣的存儲到存儲器中,存儲器中的數據和指令可以通過地址隨機訪問,指令可以順序執行,可以跳轉(由此實現分支和循環)。
存儲器中的數據可以是隻讀的,也可以是可讀可寫,後者對於存儲單元地址的命名就是變量(畢竟存儲地址抽象難記),為方便起見,對變量的操作就是操作由變量名對應的地址所指向的一組內存單元所對應的數據值。變量名顯式使用的是其數據值,地址值只是隱含地表示(可用符號&取出其地址)。
如果想顯式地用一個變量來表示一個內存單元的地址,這樣的變量就是指針變量,指針變量存儲一個指針(地址)。指針變量與普通變量在隱式或顯式地表示數據和地址時剛好相反,指針變量是顯式地表示一個地址,隱式地表示一個地址對應的數據值(使用解引用符號*)。
對於符號“*“,不同的上下文有不同的含義,可以是指針聲明,也可以是指針引用:
int a =3;
int* p=&a; // 符號*前有數據類型時,是指針聲明
(*p)++; //符號*前無數據類型時,是指針的解引用,用於更新指針指向的地址對應的數據值
2 指針本身的地址、指針的地址值、指針的地址值指向的數據值
瞭解以上三個概念,分別看以下代碼實例及註釋:
#include <iostream>
using namespace std;
void main()
{
\tint arr[]={3,5,7,9,11};
\tint* p=arr; // 符號*前有數據類型時,是指針聲明
\tcout<\tfor(int i=0;i<sizeof>\t{
\t\t(*p)++; //符號*前無數據類型時,是指針的解引用,用於更新指針指向的地址對應的數據值
\t\tcout<\t\tcout<\t\tp++; //指針單獨做左值時(無符號*),是指針的地址值(不是地址指向的值)更新,表示指針的移動;
\t}
\tcout<\tcout<<endl>\tchar* str = "abcdefghij";
\tchar* pc = str;
\twhile(*pc++);//先pc++
\tcout<<pc-str>
system("pause");
}
/*
指針本身的地址值0012FF30
0012FF34:4 0012FF38:6 0012FF3C:8 0012FF40:10 0012FF44:12 0012FF48
11
*/
/<pc-str>/<endl>/<sizeof>/<iostream>
-End-
閱讀更多 小智雅匯 的文章