指標的定義及使用格式:
int num=0;
int *p = #
該段**定義了乙個指標p,並把它指向num的位址,實現原理是把num變數的位址作為p的值存放在p中。
一般格式為:資料型別 * 指標名;
以上為指標的定義。指標名是乙個識別符號,跟所有變數識別符號命名規則一樣。根據定義時的資料型別不同,指標同樣分為如整型指標,字元型指標,實型指標,等等型別。不同指標型別對應不同變數,即只能指向相對應資料型別的變數。
本質上,指標也是乙個變數,只是該變數的值是乙個位址,是它指向的目標變數的位址。另外一點,由於指標的值是記憶體空間的位址,用sizeof()函式可以發現,無輪定義指標時時實型,整型還是浮點型,指標的長度都為4,因為記憶體位址4個幾節足以儲存。這也是指標的特殊性之一。
指標的算術運算:
包括加減,自加,自減幾種。
指標的算術運算的結果是指標指向的位址相應移動乙個變數的位置。比如原指向乙個整型變數,則執行++運算後,指標指向的位址值將增加4,即4個位元組。以此推論,如果指標原指向乙個字元變數,++後,指標指向的位址的值只增加1。
//指標的算術運算
int a;
int *p=&a;
//p=&a;
char b;
void *p1=&b;
cout <
cout <
return 0;
執行結果為:
指標和陣列
指標和陣列什麼關係?據說是好**。學完指標,我對陣列的理解也更深刻了。
int a[5];
int *p=a;
cout << sizeof(p) << endl;
cout << p<< endl;
cout << a << endl;
最後一行**直接輸出陣列名a,我們會發現,a的值其實是乙個位址。。。事實上,a確實代表了陣列a的首位址(可以把陣列名看作乙個指向該陣列首位元素位址的指標,不過該指標是不可更改的,與指標變數是有區別的),陣列作為乙個連續空間記憶體的變數,又可以通過指標直接指向a的值(是不是像指標指向來指標),聯想到指標的算術運算,整個陣列用指標來操作實在是再方便不過了。。。
比如用指針對乙個空的陣列賦值:
int a[7];
int *p=a;
for(int i=0;i<7;i++)//此處直接把i的值依次賦給陣列元素
p-=7;//指標重新回到陣列首位
for(int j=0;j<7;j++)//輸出陣列
其它操作自行領悟。
注:指標是個好東西,也是個危險的東西。由於指標可以通過算術運算任意改變指向位置,一旦編寫時有邏輯錯誤,讓指標指向了它本不該指向的地方。此時若通過指標修改了對應位址的值,嗯。。。
一維陣列很好理解,計算機中一塊連續的記憶體空間,反應的也是一系列相同型別的資料。
先上**:
//二維陣列和多維陣列
int a1[5][6];//定義乙個二維陣列
int *p=0;//指標定義為空
int t=0;
for(int i=0;i<5;i++)//迴圈賦值
}for(int i=0;i<5;i++)//按行列列印看陣列賦值效果
{for(int j=0;j<6;j++)
{cout 可以發現,無論是一維陣列還是多維陣列,其元素的物理儲存方式均是線性連續的。
如何理解多維陣列?
我在除錯程式時,發現旁邊的列表幫我們很好的理解了多維陣列:
如圖,a1為二位陣列,a2是乙個多維陣列。二維陣列是元素為一維陣列的陣列,那麼三維陣列是元素為二維陣列的陣列,如此類推。。。多維陣列,無窮盡也。。。相當於n的n次方的n次方的n次方。。。
C語言(九) 指標(3)指標與const
表示一旦得到了某個變數的位址,不能再指向其他變數 int i 0 int const q i q是 const q 20 ok q error表示不能通過指標去修改這個變數 int i 0 int j const int p i const int p 等同於 int const p p 20 er...
自學C day11 指標
int a 10 int p a 初始化必須是用位址給它初始化 使用 p 250 指標的解引用 間接引用 p 將p 變數的內容取出,當成位址看待,找到該位址對應的記憶體空間 如果做左值 存資料到空間中 如果做右值 取出空間中的內容 void 萬能指標 泛型 指標的大小與型別無關,只與當前使用的平台架...
C基礎課程筆記總結7 指標2 指標與字串陣列
指標2 指標與字串陣列 在oc中,指標與字串陣列的應用是真正需要掌握的知識點。定義乙個字串,一般是通過定義乙個字元陣列來接收這個字串,例如 char a it 輸出字串可以這樣操作 printf s n a 用 s來表示字串,並且s檢測的是對應的位址,然後輸出該位址儲存的值,而不是直接輸出值,因此可...