【C语言】(7)—指针1
文章目录
- 一、内存和地址基础
- 1.1 内存的基本概念
- 1.2 地址与指针的关系
- 二、指针变量基础
- 2.1 取地址操作符(&)
- 2.2 指针变量声明与初始化
- 三、指针类型与指针运算
- 3.1 指针类型的重要性
- 3.2 指针运算
- 四、const与指针
一、内存和地址基础
1.1 内存的基本概念
1.1 内存的基本概念
计算机内存可以想象成一栋巨大的宿舍楼,每个房间(内存单元)都有一个唯一的编号(地址)。CPU通过这个地址来访问特定的内存空间。
内存单元:
每个内存单元大小为1字节(8位)
每个内存单元都有唯一地址
地址通常用十六进制表示(如0x006FFD70)
计算机存储单位:
1 Byte = 8 bit
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
1 PB = 1024 TB
1.2 地址与指针的关系
在C语言中,我们使用指针来存储和操作内存地址:
内存单元的编号 == 地址 == 指针
二、指针变量基础
2.1 取地址操作符(&)
通过&操作符可以获取变量的内存地址:
#include <stdio.h>int main() {int a = 10;printf("变量a的地址:%p\n", &a);return 0;
}
2.2 指针变量声明与初始化
int a = 10;
int *pa = &a; // 声明一个指向int的指针,并初始化为a的地址
三、指针类型与指针运算
3.1 指针类型的重要性
指针类型决定了:解引用时能访问多少字节指针加减整数时的步长
int n = 0x11223344;
int *pi = &n;
char *pc = (char *)&n;*pi = 0; // 修改4个字节
*pc = 0; // 只修改1个字节
3.2 指针运算
指针支持三种基本运算:
指针±整数:根据类型决定步长
c
int arr[5] = {1,2,3,4,5};
int *p = &arr[0];
printf("%d\n", *(p+2)); // 输出arr[2]的值3
指针-指针:计算两个指针之间的元素个数
c
int diff = &arr[4] - &arr[0]; // 结果为4
指针关系运算:比较指针位置
c
while(p < &arr[5]) {printf("%d ", *p++);
}
四、const与指针
int a = 10, b = 20;// 1. 指向常量的指针
const int *p1 = &a;
// *p1 = 30; // 错误,不能通过p1修改a
p1 = &b; // 正确,可以改变指向// 2. 指针常量
int * const p2 = &a;
*p2 = 30; // 正确,可以修改a的值
// p2 = &b; // 错误,不能改变指向// 3. 指向常量的指针常量
const int * const p3 = &a;
// *p3 = 40; // 错误
// p3 = &b; // 错误