### [指針](http://www.hmoore.net/alex_wsc/jni/2019192)

```
#include <stdio.h>
int main ()
{
int var_runoob = 10;
int *p; // 定義指針變量
p = &var_runoob;
printf("var_runoob 變量的地址: %p\n", p);
return 0;
}
```
輸出結果
~~~
var_runoob 變量的地址: 0x7ffecfbfcd54
~~~

#### **鏈表數據結構**
指針的最大作用是構造數據結構,使用指針將不連續的內存空間連接到一起,如:最簡單的數據結構鏈表,它是非連續、非順序的存儲結構,有一些節點組成,節點當中包括數據域和指針域,數據域用來存儲相應的數據,指針域用來存儲下一個節點的地址,這些節點通過指針相連之后,就形成了鏈表。如節點1和節點2連接,就是將節點1的next域中存儲節點2的地址,通過這個地址就可以從節點1找到節點2

```
#include <stdio.h>
#include <stdlib.h>
//鏈表節點的數據結構
struct ListNode
{
int val;//數據域
struct ListNode *next;//連接下一個節點的指針
};
void main() {
//創建5個鏈表節點 a, b, c, d, e
struct ListNode a, b, c, d, e;
//將它們賦值為1、2、3、4、5
a.val = 1;
b.val = 2;
c.val = 3;
d.val = 4;
e.val = 5;
//通過next指針,將它們依次相連
a.next = &b;
b.next = &c;
c.next = &d;
d.next = &e;
e.next = NULL;
struct ListNode *head=&a;
while (head)
{
//循環打印鏈表中節點的值、節點的地址和節點的next指針
printf("val = [%d] address=[%p] next=[%p]\n",head->val,head,head->next);
head = head->next;
}
system("pause");
}
```
輸出結果

從打印結果可以看出:**val的值為1到5,next指針當中存儲了下一個節點的地址,最后一個節點的next指針為空,這樣就實現了獨立節點的創建、鏈接和遍歷**。
#### **指向指針的指針**
一般多層指針不常用到(數組會用到二級指針,三級指針很少用到),指針最常見的用途還是構造數據結構和操作內存。動態內存分配給二維數組。
如圖所示,一般我們用一個矩形來表示一個標量

多層指針的演示

```
#include <stdio.h>
#include <stdlib.h>
void main() {
int number = 5;//聲明number,賦值為5
int *ptr1 = &number;//將指針ptr1指向number,賦值為number的地址
int **ptr2 = &ptr1;
int ***ptr3 = &ptr2;
printf("number的地址:%#x\n", &number);
printf("number的值:%d\n", number);
printf("\n");
printf("ptr1的地址:%#X\n", &ptr1);
printf("ptr1的值:%#X\n", ptr1);
printf("ptr1指向的變量的值:%d\n", *ptr1);
printf("\n");
printf("ptr2的地址:%#X\n", &ptr2);
printf("ptr2的值:%#X\n", ptr2);
printf("ptr2指向的變量的值:%#X\n", *ptr2);
printf("\n");
printf("ptr3的地址:%#X\n", &ptr3);
printf("ptr3的值:%#X\n", ptr3);
printf("ptr3指向的變量的值:%#X\n", *ptr3);
printf("\n");
system("pause");
}
```
輸出結果
```
number的地址:0xbffe9c
number的值:5
ptr1的地址:0XBFFE90
ptr1的值:0XBFFE9C
ptr1指向的變量的值:5
ptr2的地址:0XBFFE84
ptr2的值:0XBFFE90
ptr2指向的變量的值:0XBFFE9C
ptr3的地址:0XBFFE78
ptr3的值:0XBFFE84
ptr3指向的變量的值:0XBFFE90
```