2026/3/11 9:01:03
网站建设
项目流程
引流软件下载站,公司的网站建设费用属于什么费,表白网站是怎么做的,关于做芯片类招聘的网站目录#xff1a; 1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. 指针运算———————————————————————————————————————————1. 内存和地址1.1 内存我们知道计算机上CPU#xff08;中央处理器#xff09;在处理数据的时…目录1.内存和地址2.指针变量和地址3.指针变量类型的意义4.指针运算———————————————————————————————————————————1.内存和地址1.1内存我们知道计算机上CPU中央处理器在处理数据的时候需要的数据是在内存中读取的处理后的数据也会放回内存中那我们买电脑的时候电脑上内存是 8GB/16GB/32GB 等那这些内存空间如何高效的管理呢其实也是把内存划分为⼀个个的内存单元每个内存单元的大小取1个字节。计算机中常见的单位补充⼀个比特位可以存储⼀个2进制的位1或者01Byte 8bit 1KB 1024Byte 1MB 1024KB 1GB 1024MB 1TB 1024GB 1PB 1024TB其中每个内存单元相当于⼀个学生宿舍⼀个字节空间里面能放8个比特位就好比同学们住的八人间每个人是⼀个比特位。每个内存单元也都有⼀个编号这个编号就相当于宿舍房间的门牌号有了这个内存单元的编号CPU就可以快速找到⼀个内存空间。生活中我们把门牌号也叫地址在计算机中我们把内存单元的编号也称为地址。C语言中给地址起了新的名字叫指针。1.2究竟该如何理解编址CPU访问内存中的某个字节空间必须知道这个字节空间在内存的什么位置而因为内存中字节很多所以需要给内存进行编址(就如同宿舍很多需要给宿舍编号⼀样)。计算机中的编址并不是把每个字节的地址记录下来而是通过硬件设计完成的。2.指针变量和地址2.1取地址操作符理解了内存和地址的关系我们再回到C语言在C语言中创建变量其实就是向内存申请空间#include stdio.h int main() { int a 10; a;//取出a的地址 printf(%p\n, a); return 0; }这样就可以打印出a的地址a取出的是a所占4个字节中地址较小的字节的地址。2.2指针变量和解引用操作符*2.2.1指针变量那我们通过取地址操作符()拿到的地址是⼀个数值比如0x006FFD70这个数值有时候也是需要存储起来方便后期再使用的那我们把这样的地址值存放在哪里呢答案是指针变量中。例#include stdio.h int main() { int a 10; int * pa a;//取出a的地址并存储到指针变量pa中 return 0; }指针变量也是⼀种变量这种变量就是用来存放地址的存放在指针变量中的值都会理解为地址。2.2.2如何拆解指针类型我们看到pa的类型是int*我们该如何理解指针的类型呢int a 10; int * pa a;这里pa左边写的是int**是在说明pa是指针变量而前面的int是在说明pa指向的是整型(int)类型的对象。⼀个char类型的变量chch的地址要放在什么类型的指针变量中呢char ch w; char* pc ch; // pc 是指向 char 类型的指针2.2.3解引用操作符C语言中其实也是⼀样的我们只要拿到了地址指针就可以通过地址指针找到地址指针 指向的对象这里必须学习⼀个操作符叫解引⽤操作符(*)。#include stdio.h int main() { int a 100; int* pa a; *pa 0; return 0; }上面代码中第7行就使用了解引用操作符*pa就是通过pa中存放的地址找到指向的空间 *pa其实就是a变量了所以*pa 0这个操作符是把a改成了0。但这里如果目的就是把a改成0的话写成a 0;不就完了为啥非要使用指针呢其实这里是把a的修改交给了pa来操作这样对a的修改就多了⼀种的途径写代码就会更加灵活后期就能理解了。2.3指针变量的大小如果指针变量是用来存放地址的那么指针变量的大小就得是4个字节的空间才可以。同理64位机器假设有64根地址线⼀个地址就是64个二进制位组成的二进制序列存储起来就需要8个字节的空间指针变量的大小就是8个字节。#include stdio.h //指针变量的⼤⼩取决于地址的⼤⼩ //32位平台下地址是32个bit位即4个字节 //64位平台下地址是64个bit位即8个字节 int main() { printf(%zd\n, sizeof(char *)); printf(%zd\n, sizeof(short *)); printf(%zd\n, sizeof(int *)); printf(%zd\n, sizeof(double *)); return 0; }32位操作系统下运行结果 64位操作系统下运行结果结论32位平台下地址是32个bit位指针变量大小是4个字节64位平台下地址是64个bit位指针变量大小是8个字节注意指针变量的大小和类型是无关的只要指针类型的变量在相同的平台下大小都是相同的。3.指针变量类型的意义3.1指针的解引用//代码1 #include stdio.h int main() { int n 0x11223344; int *pi n; *pi 0; return 0; }//代码2 #include stdio.h int main() { int n 0x11223344; char *pc (char *)n; *pc 0; return 0; }对比两个代码的运行结果可以看到代码1会将n的4个字节全部改为0但是代码2只是将n的第⼀个字节改为0。结论char*的指针解引用就只能访问⼀个字节而int*的指针的解引用就能访问四个字节3.2指针-整数运行下面的代码观察输出结果中地址的变化#include stdio.h int main() { int n 10; char *pc (char*)n; int *pi n; printf(%p\n, n); printf(%p\n, pc); printf(%p\n, pc1); printf(%p\n, pi); printf(%p\n, pi1); return 0; }我们可以看出char*类型的指针变量1跳过1个字节int*类型的指针变量1跳过了4个字节。int跳过一个整形变量所以是四个字节结论指针的类型决定了指针向前或者向后走⼀步有多大距离3.3void* 指针在指针类型中有⼀种特殊的类型是void * 类型的可以理解为无具体类型的指针void*类型的指针不能直接进行指针的 - 整数和解引用的运算。例#include stdio.h int main() { int a 10; int* pa a; char* pc a; return 0; }在上⾯的代码中将⼀个int类型的变量的地址赋值给⼀个char*类型的指针变量。编译器给出了⼀个警告如下图是因为类型不兼容。而使用void*类型不会出现这样的问题。使用void*类型的指针接收地址#include stdio.h int main() { int a 10; void* pa a; void* pc a; *pa 10; *pc 0; return 0; }通过编译我们可以看到void*类型的指针可以接收不同类型的地址但是无法直接进行指针运算。⼀般void*类型的指针是使用在函数参数的部分来接收不同类型数据的地址可以实现泛型编程的效果。使得⼀个函数来处理多种类型的数据在后文中会深入理解。4.指针运算指针的基本运算有三种分别是•指针- 整数•指针-指针•指针的关系运算4.1指针- 整数int arr[10] {1,2,3,4,5,6,7,8,9,10};#include stdio.h //指针- 整数 int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; int* p arr[0]; int i 0; int sz sizeof(arr) / sizeof(arr[0]); for (i 0; i sz; i) { printf(%d , *(p i));//pi 这⾥就是指针整数 } return 0; }4.2指针 - 指针//指针-指针 #include stdio.h int my_strlen(char* s) { char* p s; while (*p ! \0) p; return p - s; } int main() { printf(%d\n, my_strlen(abc)); return 0; }4.3指针的关系运算//指针的关系运算 #include stdio.h int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; int* p arr[0]; int sz sizeof(arr) / sizeof(arr[0]); while (p arr sz) //指针的⼤⼩⽐较 { printf(%d , *p); p; } return 0; }———————————————————————————————————————————完JohnWick2026.1.19