### 基本操作
~~~
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
```