目录:
1.内存和地址
1.1内存
我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑的时候,电脑上内存是 8GB/16GB/32GB 等,那这些内存空间如何高效的管理呢?
1Byte = 8bit 1KB = 1024Byte 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB 1PB = 1024TB1.2究竟该如何理解编址
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指针变量
#include <stdio.h> int main() { int a = 10; int * pa = &a;//取出a的地址并存储到指针变量pa中 return 0; }2.2.2如何拆解指针类型
int a = 10; int * pa = &a;⼀个char类型的变量ch,ch的地址,要放在什么类型的指针变量中呢?
char ch = 'w'; char* pc = &ch; // pc 是指向 char 类型的指针2.2.3解引用操作符
#include <stdio.h> int main() { int a = 100; int* pa = &a; *pa = 0; return 0; }2.3指针变量的大小
#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位操作系统下运行结果
结论:
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", pc+1); printf("%p\n", pi); printf("%p\n", pi+1); return 0; }3.3void* 指针
在指针类型中有⼀种特殊的类型是void * 类型的,可以理解为无具体类型的指针,
例:
#include <stdio.h> int main() { int a = 10; int* pa = &a; char* pc = &a; return 0; }#include <stdio.h> int main() { int a = 10; void* pa = &a; void* pc = &a; *pa = 10; *pc = 0; return 0; }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));//p+i 这⾥就是指针+整数 } 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; }———————————————————————————————————————————
完
JohnWick
2026.1.19