嵌入式学习-01C语言day08

本文深入探讨了C语言中的指针概念,包括指针的理解、内存地址、指针定义、指针运算及指针与数组的关系。通过实例展示了如何使用指针进行间接访问、指针加减、自增自减运算,以及指针在数组遍历中的应用。同时,对比了数组名和指针的不同,讲解了字符指针在处理字符串时的角色和特点。
摘要由CSDN通过智能技术生成

嵌入式学习-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;

 

  // 打印变量 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 = &num;

 

  // 创建指针 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
  • 36
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路x飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值