企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
### 基本操作 ~~~ 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 ```