C 语言学习七:指针

指针

  • 指针与地址
    • 指针的声明和初始化
    • 指针的解引用
    • 指针的比较
    • 指针和数组
    • 指针数组
    • 指针和动态内存分配
  • 指针与函数参数
    • 指针作为函数参数
    • 二级指针
  • 指向函数的指针

指针与地址

指针的声明和初始化

int variable = 42;
int *ptr = &variable;
//间接访问
int value = *ptr; // value 等于 x 的值,即 42char str[] = "Hello"; // 字符串数组
const char* ptr = "World";  // 字符串指针
  • 空指针:未指向任何对象的指针

    int *ptr = NULL;
    

指针的解引用

通过指针可以访问或修改其指向的变量的值,通过使用解引用操作符 * 完成。

int value = *ptr;  // 通过指针获取变量的值
*ptr = 10;         // 通过指针修改变量的值

指针的比较

指针可以进行大小比较,但要注意指针比较的是地址而不是指向的值

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
int main() {int arr[5] = { 1, 2, 3, 4, 5 };int* ptr1 = arr;int* ptr2 = arr + 2;printf("*ptr1=%d\n", *ptr1);printf("*ptr2=%d\n", *ptr2);printf("ptr1=%d\n", ptr1);printf("ptr2=%d\n", ptr2);if (ptr1 < ptr2) {// 执行此处代码}return 0;
}

在这里插入图片描述

指针和数组

指针可以进行算术运算,例如指针加法和指针减法。在数组遍历和动态内存管理中非常有用(区分开地址和值的变化

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>int main() {int arr[5] = { 1, 2, 3, 4, 5 };int* ptr = arr;// 指针加法ptr = ptr + 2; // 移动两个元素*ptr = *ptr - 1;	//值变化printf("*ptr=%d", *ptr);// 现在 ptr 指向 arr[1]return 0;
}

指针数组

  1. 定义: 指针数组是一个数组,其元素都是指针

    int *ptrArray[5]; // 声明一个包含 5 个指针的数组
    
  2. 初始化:指针数组的每个元素必须指向相同类型或相同结构的数据

    int a = 5, b = 10, c = 15;
    int *ptrArray[3] = {&a, &b, &c}; // 初始化指针数组
    
  3. 使用:当需要一次性操作多个相关的指针,而这些指针的数量可能在运行时发生变化时,使用指针数组能够更方便地管理这些指针。

指针和动态内存分配

malloc、calloc、realloc 和 free 等函数用于动态内存分配和释放,返回的是指向动态分配内存的指针。

int *dynamicArray = (int *)malloc(5 * sizeof(int));

指针与函数参数

指针作为函数参数

  • 函数可以接受指针作为参数,允许函数修改调用者提供的变量的值

    void modifyValue(int *ptr) {*ptr = 100;
    }int main() {int value = 42;modifyValue(&value);// 此时 value 的值变为 100
    }
    
  • 同样的也可以修改数组的元素

    void modifyArray(int *arr, int size) {for (int i = 0; i < size; ++i) {arr[i] *= 2;}
    }int main() {int arr[] = {1, 2, 3, 4, 5};modifyArray(arr, 5);	//数组名就是数组的首地址// 此时 arr 变为 {2, 4, 6, 8, 10}
    }
    

二级指针

动态分配内存为例
当传递一个指针给函数时,传递的是指针的拷贝。如果在函数内部分配了新的内存,并将这个新内存的地址赋给传入的指针,这对于调用者的指针没有影响。为了解决这个问题,可以传递一个指针的指针,也就是二级指针

void allocateMemory(int **ptr) {*ptr = (int *)malloc(sizeof(int));**ptr = 42;
}int main() {int *dynamicValue;allocateMemory(&dynamicValue);// 此时 dynamicValue 指向了动态分配的内存,其值为 42
}

int **ptr 表示一个指向指针的指针。这是为了能够在函数内部修改指针的值。

指向函数的指针

  1. 定义函数指针:函数指针的声明形式类似于函数声明,只需在函数名前面加上指针类型,例如int (*ptr)(int, int);表示 ptr 是一个指向接受两个整数参数并返回整数的函数的指针

  2. 初始化函数指针:ptr = &add;其中 add 是一个函数,ptr 就指向了这个函数

  3. 用途:
    回调函数: 当你需要在某个地方注册一个函数,以便在特定事件发生时调用它时,函数指针就非常有用。例如,你可能有一个事件处理器,允许用户注册一个函数,然后在某个事件发生时调用该函数

    // 使用函数指针实现回调
    void eventHandler(void (*callback)(int)) {// 做一些操作int data = 42;// 调用注册的回调函数callback(data);
    }// 注册的回调函数
    void myCallback(int value) {printf("Callback called with value: %d\n", value);
    }int main() {// 在事件处理器中注册回调函数eventHandler(myCallback);return 0;
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/459243.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java设计模式:观察者模式

在平常的开发工作中&#xff0c;经常会使用到设计模式。合理的使用设计模式&#xff0c;可以提高开发效率、提高代码质量、提高代码的可拓展性和维护性。今天来聊聊观察者模式。 观察者模式是一种行为型设计模式&#xff0c;用于对象之间一对多的依赖关系&#xff0c;当被观察对…

Linux第43步_移植ST公司uboot的第4步_uboot测试

uboot移植结束后&#xff0c;需要进行测试。 1、烧录程序 1)、将STM32MP157开发板的网络接口与路由器的网络接口通过网线连接起来。 2)、将开发板的串口和电脑通过USB线连接起来。 3)、将开发板的USB OTG接口和电脑通过USB线连接起来。 4)、将开发板上拨码开关拨到“000”…

IS-IS P2P网路类型 地址不在同一子网建立邻居关系

拓扑图 由于IS-IS是直接运行在数据链路层上的协议&#xff0c;并且最早设计是给CLNP使用的&#xff0c;IS-IS邻居关系的形成与IP地址无关。但在实际的实现中&#xff0c;由于只在IP上运行IS-IS&#xff0c;所以是要检查对方的IP地址的。如果接口配置了从IP&#xff0c;那么只要…

beep蜂鸣器驱动实验-蜂鸣器驱动代码框架测试

一. 简介 上一篇文章学习了编译蜂鸣器驱动框架代码&#xff0c;并进行了编译。文章地址如下&#xff1a; beep蜂鸣器驱动实验-蜂鸣器驱动框架代码实现-CSDN博客 本文对上一篇所实现的蜂鸣器框架代码进行测试。 二. 蜂鸣器驱动代码框架测试 1. 拷贝驱动程序 注意&#xf…

MongoDB部署策略

内 容 简 介 本文介绍了MongoDB数据库的优点的数据存储模式的安装部署过程。 利用MongoDB在存储海量数据上的优势&#xff0c;部署存储空间大数据。 欢迎批评指正补充 由于编者水平有限&#xff0c;所搜集资料也很有限&#xff0c;制定的规范肯定有考虑不周全、甚至完全错误…

Pymysql之Connection中常用API

Connection中常用API 1、open() &#xff1a;检测数据库是否连接。 connect.open&#xff1a;如果数据库连接返回Trhe&#xff0c;否则返回False。 2、ping(reconnectTrue) connect.ping(reconnectTrue):如果reconnectTrue表示连接断开后&#xff0c;重新进行连接。 import…

C++重新入门-C++变量作用域

目录 1.C变量定义 2.C作用域 3.局部变量 4.全局变量 5.块作用域变量 6.初始化局部变量和全局变量 1.C变量定义 一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明的变量&#xff0c;称为…

Mysql进阶(sql优化和explain关键字)

一、为什么要对SQL进行优化&#xff1f; 由于业务数据量的增多&#xff0c;SQL的执行效率对程序的运行效率影响增大&#xff0c;此时就需要对SQL进行优化。 二、SQL优化的方法 1.查询sql尽量不要使用select * &#xff0c;而是具体字段。 节省资源&#xff0c;减少开销。 …

1572.矩阵对角线元素的和(Java)

题目描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 输入&#xff1a; mat [[1,2,3], [4,5,6], [7,8,9]] 输出&#xff1a; 25 解释&#xff1a;对角线的和为&…

1978-2022年地级市全要素生产率数据

1978-2022年地级市全要素生产率数据 1、时间&#xff1a;1978-2022年 2、来源&#xff1a;城市统计年鉴以及各省市的统计年鉴 3、指标&#xff1a;省份、地区、年份、OLS、FE、RE、DGMM、SGMM、SFA1、SFA2、SFA3、SFA3D、TFE、非参数法 4、范围&#xff1a;421地区 5、参考…

前端架构: 从vue-cli探究脚手架原理

从使用角度理解什么是脚手架 脚手架本质是一个操作系统的客户端 在终端中去执行一个命令&#xff0c;这个命令本身它就是一个客户端我们其实可以把脚手架理解为操作系统的一个客户端通过命令去执行它的时候&#xff0c;这个命令往往是这样的一个构造&#xff0c;如下 比如&…

图像处理入门:OpenCV的基础用法解析

图像处理入门&#xff1a;OpenCV的基础用法解析 引言OpenCV的初步了解深入理解OpenCV&#xff1a;计算机视觉的开源解决方案什么是OpenCV&#xff1f;OpenCV的主要功能1. 图像处理2. 图像分析3. 结构分析和形状描述4. 动态分析5. 三维重建6. 机器学习7. 目标检测 OpenCV的应用场…