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://xiahunao.cn/news/2776032.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AD9361多片同步设计方法

本文基于ZC706FMCOMMS5的平台&#xff0c;介绍了多片AD9361同步的方法。并将该设计移植到自行设计的ZYNQ70354片AD9361(实现8路同步收发)的电路板上。本设计采用纯逻辑的方式&#xff0c;仅使用了ZYNQ芯片的PL部分。 9361多芯片同步主要包括基带同步和射频同步两大块任务。其中…

nacos配置自动刷新源码解析

文章目录 一、前言二、源码解析1、nacos客户端如何监听服务端配置变化的2、ConfigurationProperties注解的bean是如何自动刷新的3、RefreshScope 注解的bean是如何自动刷新的 三、总结 一、前言 最近好奇 nacos 是怎么做到配置自动刷新的&#xff0c;于是就去debug跟了下源码&…

使用CURL命令实现tftp和ftp客户端功能

要使用curl命令实现FTP文件发送&#xff0c;您需要使用以下命令格式&#xff1a; curl -T <local_file_path> -u <username>:<password> ftp://<ftp_server_address>/<remote_file_path> 其中: <local_file_path> 是本地文件的路径&…

下载已编译的 OpenCV 包在 Visual Studio 下实现快速配置

自己编译 OpenCV 挺麻烦的&#xff0c;配置需要耗费很长时间&#xff0c;编译也需要很长时间&#xff0c;而且无法保证能全部编译通过。利用 OpenCV 官网提供的已编译的 OpenCV 库可以节省很多时间。下面介绍安装配置方法。 1. OpenCV 官网 地址是&#xff1a;https://opencv…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(3.详解String数据结构)

【Redis】深入理解 Redis 常用数据类型源码及底层实现&#xff08;1.结构与源码概述&#xff09;-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底层实现(2.版本区别dictEntry & redisObject详解)-CSDN博客 紧接着前两篇的总体介绍&#xff0c;从这篇开始&#x…

yo!这里是Linux线程保姆级入门介绍

目录 前言 Linux线程基础 线程概念 底层示意图 线程vs进程 Linux线程控制 创建线程 线程ID 线程终止 线程等待 线程分离 Linux线程互斥 背景概念 互斥量mutex 1.相关接口 2.实现原理 可重入vs线程安全 死锁 Linux线程同步 条件变量 生产者消费者模型 基于…

排序算法---堆排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 堆排序&#xff08;Heap Sort&#xff09;是一种基于二叉堆数据结构的排序算法。它将待排序的元素构建成一个最大堆&#xff08;或最小堆&#xff09;&#xff0c;然后逐步将堆顶元素与堆的最后一个元素交换位置&#xff0c…

Cilium CNI深度指南

Cilium是基于eBPF的功能强大的CNI插件&#xff0c;为云原生环境提供了强大的网络和安全支持。原文: Cilium CNI: A Comprehensive Deep Dive Guide for Networking and Security Enthusiasts! &#x1f313;简介 欢迎阅读为网络和安全爱好者提供的全面深入的指南&#xff01; 本…

深度分析一款新型Linux勒索病毒

前言 DarkRadiation勒索病毒是一款全新的Linux平台下的勒索病毒&#xff0c;2021年5月29日首次在某平台上发布了此勒索病毒的相关的信息&#xff0c;6月中旬趋势科技针对这个新型的勒索病毒进行了相关的分析和报道。 DarkRadiation勒索病毒采用Bash脚本语言编写实现&#xff0…

恒流源方案对比

1、双运放恒流源 2、运放三极管放大电路组成的恒流源 5A 3、运放三极管组成的恒流源 200uA 4、运放MOS管组成的恒流源 100mA 5、电源模块并联输出100A恒流

【前沿技术杂谈:多模态文档基础模型】使用多模态文档基础模型彻底改变文档 AI

【前沿技术杂谈&#xff1a;多模态文档基础模型】使用多模态文档基础模型彻底改变文档 AI 从文本到多模态模型&#xff1a;文档 AI 逐渐发展新技能。行业领先的型号Document AI 的下一步&#xff1a;开发通用和统一框架 您是否曾经被包含不同信息&#xff08;如应付账款、日期、…

通过nginx学习linux进程名的修改

目录 1. 缘起2. 背景知识3. 源码分析3.1 准备工作3.2 设置进程名字 1. 缘起 在运行nginx的时候&#xff0c;用ps查看nginx的进程信息&#xff0c;可能的输出如下&#xff1a; root 42169 3105 0 16:51 ? 00:00:00 nginx: master process ./objs/nginx root …

Java图形化界面编程—— 基本组件和对话框 笔记

2.5 AWT中常用组件 2.5.1 基本组件 组件名功能ButtonButtonCanvas用于绘图的画布Checkbox复选框组件&#xff08;也可当做单选框组件使用&#xff09;CheckboxGroup选项组&#xff0c;用于将多个Checkbox 组件组合成一组&#xff0c; 一组 Checkbox 组件将只有一个可以 被选中…

供应链|Managemeng Science 论文解读:数据驱动下联合定价和库存控制的近似方法 (一)

编者按 本次解读的文章发表于 Management Science&#xff0c;原文信息&#xff1a;Hanzhang Qin, David Simchi-Levi, Li Wang (2022) Data-Driven Approximation Schemes for Joint Pricing and Inventory Control Models. https://doi.org/10.1287/mnsc.2021.4212 文章在数…

代码随想录算法训练营第四十六天(动态规划篇)|01背包(滚动数组方法)

01背包&#xff08;滚动数组方法&#xff09; 学习资料&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff08;和上次一样&#xff09;&#xff1a;题目页面 (kamacoder.com) 思路 使用一维滚动数组代替二维数组。二维数组的解法记录在&#xff1a;代码随想录算…

最新的 Ivanti SSRF 零日漏洞正在被大规模利用

Bleeping Computer 网站消息&#xff0c;安全研究员发现 Ivanti Connect Secure 和 Ivanti Policy Secure 服务器端请求伪造 (SSRF) 漏洞&#xff08;CVE-2024-21893 &#xff09;正在被多个威胁攻击者大规模利用。 2024 年 1 月 31 日&#xff0c;Ivanti 首次就网关 SAML 组件…

【工作学习 day04】 9. uniapp 页面和组件的生命周期

问题描述 uniapp常用的有&#xff1a;页面和组件&#xff0c;并且页面和组件各自有各自的生命周期函数&#xff0c;那么在页面/组件请求数据时&#xff0c;是用created呢&#xff0c;还是用onLoad呢&#xff1f; 先说结论: 组件使用组件的生命周期&#xff0c;页面使用页面的…

机器学习11-前馈神经网络识别手写数字1.0

在这个示例中&#xff0c;使用的神经网络是一个简单的全连接前馈神经网络&#xff0c;也称为多层感知器&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;。这个神经网络由几个关键组件构成&#xff1a; 1. 输入层 输入层接收输入数据&#xff0c;这里是一个 28x…

双侧条形图绘制教程

写在前面 双侧条形图在我们的文章中也是比较常见的&#xff0c;那么这样的图形是如何绘制的呢&#xff1f; 以及它使用的数据类型是什么呢&#xff1f; 这些都是我们在绘制图形前需要掌握的&#xff0c;至少我们知道绘图的数据集如何准备&#xff0c;这样才踏出第一步。 今天…

基于Linux操作系统的Docker容器安装MySQL随笔

1、在Linux上安装Docker容器 cd /etc/yum.repos.d/ curl -O https://download.docker.com/linux/centos/docker-ce.repo sed -i s/$releasever/8/g docker-ce.repo yum install -y docker-ce 2、修改Docker默认镜像仓库&#xff0c;然后启动Docker容器 sudo mkdir -p /etc/do…