### 基本操作
~~~
int num1 = 100;
int *p = &num1;
printf("%p\n", &num1); //獲取地址
printf("%X\n", p); //打印指針的值
*p = 200; //為指針變量重新賦值
printf("%d\n", *p);
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(long *));
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(float *));
printf("%d\n", sizeof(double *));
~~~
```
0x7ffee17c8a78
E17C8A78
200
8
8
8
8
8
8
8
```
### 32位操作系統和63位操作系統
64位操作系統的"64位"指的是CPU的字長,即CPU每次能處理64位二進制數據.64位操作系統是指特別為64位架構計算機系統而設計的操作系統。字長是CPU的主要技術指標之一,指的是CPU一次能并行處理的二進制位數,字長總是8的整數倍,通常PC機的字長為16位(早期),32位,64位。
內存地址是一個無符號的int類型,是物理存在的.每一個變量的內存地址都是唯一的.那么再32位操作系統下11111111111111111111111111111111的值等于10進制 4294967295. 所以在32位操作系統下,能識別的內存大小不超過4G.所以指針的大小就是4個字節(32位二進制). 而在64位操作系統下,內存的大小是64位的,那么就是8個字節. 所以指針的大小也就是8了.因為指針存放的是內存地址.
### 指針怎么知道要改變多少個值的呢?
一個int類型占用四個內存地址. 那么當我們操作一個指針*p去修改值的時候,其實*p中存放的是int類型變量的首地址的.那么它怎么知道要修改幾個字節的數據呢? 因為我們是用int*類型的指針存放地址的.所以它會把該地址向后的4個地址的數據進行修改.如果是char類型那么編譯器就知道去改變1個字節的數據了.
### 指針操作數組
~~~
int arr[10] = {0};
void *p = arr;
*(int *) p = 100;
*((int *) p + 1) = 200; //加一個int單位
for (int i = 0; i < 10; ++i) {
printf("%d\n", arr[i]);
}
~~~
```
100
200
0
0
0
0
0
0
0
0
```