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.mzph.cn/news/673950.shtml

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

相关文章

C# 实现微信自定义分享

目录 需求与调整 代码实现 获取令牌 生成合法票据 获取有效签名 客户端准备 客户端实现 小结 需求与调整 在微信中打开网页应用后&#xff0c;可以选择将地址发送给朋友进行分享&#xff0c;如下图&#xff1a; 在实际的应用中&#xff0c;我们可能不是简单的将该网页…

通过dockerfile 生成自定义nginx镜像

通过dockerfile生成自定义nginx镜像 &#xff01;&#xff01;&#xff01;docker 必须在linux环境下才能进行如果你是window则需要装虚拟机 新建一个文件名字为Dockerfile&#xff0c;无需后缀 文件完整名就是Dockerfile 编写dockerfile FROM nginx RUN echo hello nginx!…

Ubuntu Linux使用PL2302串口和minicom进行开发板调试

调试远程的服务器上面的BMC&#xff0c;服务器上面安装了Ubuntu&#xff0c;想着可以在服务器接个串口到BMC&#xff0c;然后SSH到服务器的Ubuntu&#xff0c;用minicom来查看串口信息。 准备&#xff1a; 服务器Ubuntu安装mimicom 本机可以ssh到Ubuntu 串口工具PL2302 或者CH3…

【数据分享】1929-2023年全球站点的逐年平均降水量(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全…

全局唯一id生成器 各种实现记录

全局唯一id生成器 Redis 生成 前提知识~~ 时间戳 时间戳这个东西我们老是听到,却可能不是特别了解 首先,时间戳是从1970年1月1号0点0分开始的秒数,我查了蛮多资料,理论上来说,时间戳是没有上限的,而我们一般用位数来限制这里的上限,比如32位 我们来实际计算一下 32位的二进…

巴尔加瓦算法图解:算法运用。

树 如果能将用户名插入到数组的正确位置就好了&#xff0c;这样就无需在插入后再排序。为此&#xff0c;有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个节点&#xff0c;左子节点的值都比它小&#xff0c;…

MySQL用心总结

大家好&#xff0c;好久不见&#xff0c;今天笔者用心一步步写一份mysql的基础操作指南&#xff0c;欢迎各位点赞收藏 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath mysqld_bin_path(注意&#xff1a;等号与值之间有空格) mysql -h 地址 -…

Android Studio安装过程遇到SDK无法安装问题解决

首次打开studio遇到该类问题&#xff0c;需要下载SDK文件&#xff0c;后又发现SDK由于是Google源&#xff0c;无法进行正常安装&#xff0c;故转而进行SDK的镜像安装。 一、下载SDK Tools 地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio…

华为配置访客接入WLAN网络示例(MAC优先的Portal认证)

配置访客接入WLAN网络示例&#xff08;MAC优先的Portal认证&#xff09; 组网图形 图1 配置WLAN MAC优先的Portal认证示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 某企业为了提高WLAN网络的安全性&#xff0c;采用MAC优先的外置Portal认…

新型RedAlert勒索病毒针对VMWare ESXi服务器

前言 RedAlert勒索病毒又称为N13V勒索病毒&#xff0c;是一款2022年新型的勒索病毒&#xff0c;最早于2022年7月被首次曝光&#xff0c;主要针对Windows和Linux VMWare ESXi服务器进行加密攻击&#xff0c;到目前为止该勒索病毒黑客组织在其暗网网站上公布了一名受害者&#x…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-任务管理

目录 一、任务管理1.1、任务状态1.2、任务基本概念1.3、任务管理使用说明1.4、任务开发流程1.5、任务管理接口 一、任务管理 从系统角度看&#xff0c;任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它任务运行。 O…

C语言操作符详解

操作符的分类 • 算数操作符 &#xff1a; 、 - 、 * 、 / 、 % • 移位操作符 &#xff1a; << 、 >> • 位操作符 &#xff1a; & 、 | 、 ^ • 赋值操作符 &#xff1a; 、 、 - 、 * 、 / 、 % 、 << 、 >> 、 & 、 |…

音视频色彩:RGB/YUV

目录 1.RGB 1.1介绍 1.2分类 1.2.1RGB16 1)RGB565 2)RGB555 1.2.2RGB24 1.2.3RGB222 2.YUV 2.1介绍 2.2分类 2.2.1 YUV444 2.2.2 YUV 422 2.2.3 YUV 420 2.3存储格式 2.3.1 YUYV 2.3.2 UYVY 2.3.3 YUV 422P 2.3.4 YUV420P/YUV420SP 2.3.5 YU12 和…

IS-IS 接口认证密码平滑更换

拓扑图 配置 AR1、AR2建立ISIS level-2邻居关系&#xff0c;并配置接口认证密码为huawei sysname AR1 # isis 1is-level level-2network-entity 49.0000.0000.0000.0001.00 # interface GigabitEthernet0/0/0ip address 12.1.1.1 255.255.255.0 isis enable 1isis authentica…

Spark安装(Yarn模式)

一、解压 链接&#xff1a;https://pan.baidu.com/s/1O8u1SEuLOQv2Yietea_Uxg 提取码&#xff1a;mb4h tar -zxvf /opt/software/spark-3.0.3-bin-hadoop3.2.tgz -C /opt/module/spark-yarn mv spark-3.0.3-bin-hadoop3.2/ spark-yarn 二、配置环境变量 vim /etc/profile…

【typescript】特殊符号用法(?:)(??)(?.)(!)(!!)

一. 问号冒号&#xff08;?:&#xff09; 1.可以作为对象类型的可选属性&#xff0c;如&#xff1a; interface Person{name : string;age?: number; }const person1 : Person {name:"zien"} const person2 : Person {name:"sad", age:18} console.l…

MacBook有必要装清理软件吗?CleanMyMac的一些主要特点

MacBook是苹果公司的一款高端笔记本电脑&#xff0c;但是&#xff0c;随着使用时间的增长&#xff0c;MacBook也会出现一些问题&#xff0c;比如运行缓慢、卡顿、垃圾文件堆积、磁盘空间不足等。这些问题不仅影响了用户的使用体验&#xff0c;也可能对MacBook的寿命和安全性造成…

如何将国风与品牌信息相结合?

随着人们消费观念的转型升级。「国风」成为深受品牌欢迎的营销元素&#xff0c;它能够通过东方美学引起用户。然而有许多品牌在国风营销中稍不注意就会踩雷&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;国风营销怎么做才能吸引用户。 一、 与用户生活结合 要找到传统文…

ChatGPT高效提问—prompt常见用法(续篇四)

ChatGPT高效提问—prompt常见用法&#xff08;续篇四&#xff09; 1.1 知识生成 ​ 知识生成是指使用自然语言处理技术&#xff0c;通过ChatGPT等AI模型生成与特定主题相关的知识、文本或回答。在知识生成过程中&#xff0c;模型接收prompt输入的问题、指令或上下文信息&…

Vue3中路由配置Catch all routes (“*“) must .....问题

Vue3中路由配置Catch all routes (“*”) must …问题 文章目录 Vue3中路由配置Catch all routes ("*") must .....问题1. 业务场景描述1. 加载并添加异步路由场景2. vue2中加载并添加异步路由(OK)3. 转vue3后不好使(Error)1. 代码2. 错误 2. 处理方式1. 修改前2. 修…