嵌入式学习-01C语言day08
1 指针
1.1 指针的理解
1.1.1 变量的访问方式
变量在内存中分配空间,不同类型的变量占用不同大小的空间,有两种方式访问内存中的变量数据
(1)直接访问,直接使用变量名进行的访问,以前的程序中都是采用这种方式。
(2)间接访问,通过指针来实现。
1.1.2 内存地址
为了能够有效地访问到每个内存单元,就给内存单元进行了编号,这些编号被称为内存地址,因为每个内存单元都有地址,所以变量也是有地址的。
假设有 int 型变量 num,其在内存中会占用4个字节,也就是占用4个内存单元,第一个内存单元的地址即是变量 num 的地址。如图;
在32位系统中,内存地址通常是32位二进制数字,即4个字节,这允许寻址2^32(大约 4GB)个内存位置。
在64位系统中,内存地址通常是64位二进制数字,即8个字节,这允许寻址2^64个内存位置,这个数量相当大,远远超过了通常需要的内存大小。
1.1.3 什么是指针
如果一个变量专门用来存放内存地址,则它称为指针变量,通常简称为指针。我们可以通过指针间接访问内存中另一个数据。
如图,指针里面存储的是变量 num 的地址,我们可以说该指针指向变量 num,通过该指针可以间接访问变量 num。
1.1.4 指针定义
一般格式****:****
数据类型 *指针变量名 [=初始地址值];
数据类型是指针所指向的地址处的数据类型,如 int、char、float 等。
符号 * 用于通知系统,这里定义的是一个指针变量,通常跟在类型关键字的后面,表示指针指向的是什么类型的值。比如,char * 表示一个指向字符的指针,float * 表示一个指向浮点数的指针。
需要注意的是,以下三种定义指针的写法都是合法的:
int *ptr;
int* ptr;
int * ptr;
1.1.5 取址运算符和取值运算符
取址运算符,使用 & 符号表示,作用是取出变量的内存地址。如果要格式化输出地址,需使用格式占位符 %p。
取值运算符,使用 * 符号表示,作用是取出指针指向的内存地址处的数据值,也称为解引用运算符或间接引用运算符。
1.1.6 指针应用案例
1)案例1
创建一个int类型的变量,使用取址运算符取出其地址,并将其地址赋值给一个指针,然后分别打印变量的值、变量的地址、指针的值、指针的地址、指针指向的值。
代码如下:
#include <stdio.h>
int main()
{
// 定义变量
int num = 100;
// 定义一个指针,指向变量num的地址
// 这里使用 & 符号取出变量 num 的地址,再赋值给指针变量 ptr
int *ptr = #
// 打印变量 num 的值和地址
printf("num 的值是 %d \n", num);
printf("num 的地址是 %p \n\n", &num);
// 打印 ptr 的值、ptr 的地址、ptr 指向的值
printf("ptr 的值是 %p \n", ptr); // 指针 ptr 的值与变量 num 的值是相同的
printf("ptr 的地址是 %p \n", &ptr);
printf("ptr 指向的值是 %d \n", *ptr); // 指针 ptr 指向的值就是变量 num 的值
return 0;
}
输出结果:
num 的值是 100
num 的地址是 000000412d3ffdcc
ptr 的值是 000000412d3ffdcc
ptr 的地址是 000000412d3ffdc0
ptr 指向的值是 100
2)案例二
通过指针修改所指向的值,代码如下:
#include <stdio.h>
int main()
{
// 创建 double 类型的变量
double num = 2.88;
// 创建指针 p1,指向变量 num
double *p1 = #
// 创建指针 p2, 将 p1 的值赋值给 p2, p1 存储的是 num 的值,此时 p1 和 p2 都指向 num
double *p2 = p1;
// 打印 num 的值
printf("%.2f \n", num); // 2.88
// 通过指针 p1 修改 num 的值, 并打印
*p1 = 3.88;
printf("%.2f \n", num); // 3.88
// 通过指针 p2 修改 num 的值, 并打印
*p2 += 10;
printf("%.2f \n", num); // 13.88
return 0;
}
输出结果:
2.88
3.88
13.88
1.2 指针运算
1.2.1 指针加减整数
指针与整数的加减运算,表示指针所指向的内存地址的移动(加,向后移动;减,向前移动),指针移动多少,与指针指向的数据类型有关,数据类型占据多少个字节,每单位就移动多少个字节,比如一个 int 类型指针,+1 向后移动 4 个字节,-2 向前移动 8 个字节。
数组的元素在内存中连续存储的,我们通过数组元素来演示指针加减整数的情况。
#include <stdio.h>
int main()
{
// 创建数组
int nums[] = {
10, 20, 30, 40, 50};
// 创建指针并指向数组第一个元素的地址
int *ptr = &nums[0];
// 打印指针的值和指向的值
printf("ptr=%p, *ptr=%d \n", ptr, *ptr);
// 指针加3, 指针指向int类型,每个占4个字节,此时指针会向后移动12个字节
ptr += 3;
printf("ptr=%p, *ptr=%d \n", ptr