当前位置: 首页 > news >正文

指针并不是用来存储数据的,而是用来存储数据在内存中地址(内存操作/函数指针/指针函数)

在这里插入图片描述

推荐:1、4、5号书籍
在这里插入图片描述

1. 基本概念

首先,让小明了解指针的基本概念:

  • 指针的定义:指针是一个变量,它存储的是另一个变量的地址。
  • 指针的声明:例如,int *p表示一个指向整数的指针变量p

2. 形象化解释

使用形象化的比喻和图示来帮助小明理解指针的概念:

  • 房间和地址:将变量比作房间,指针比作写在纸上的房间地址。例如,变量a是一个房间,存储在某个内存位置,而指针p是写着这个房间地址的纸条。
  • 图示:画出内存布局,展示变量和指针的关系。例如:
int a = 10;
int *p = &a;

可以画出如下图示:

地址    内容
0x1000  10 (a)
0x2000  0x1000 (p)

3. 实际代码演示

通过实际代码示例,演示指针的用法:

#include <stdio.h>int main() {int a = 10;    // 定义一个整型变量a,值为10int *p = &a;   // 定义一个指针p,指向变量a的地址printf("a的值:%d\n", a);          // 输出a的值printf("a的地址:%p\n", &a);       // 输出a的地址printf("p的值:%p\n", p);          // 输出p的值,即a的地址printf("*p的值:%d\n", *p);        // 输出*p的值,即a的值return 0;
}

通过代码演示,解释每一行的含义,让小明看到指针如何指向变量,并如何通过指针访问变量的值。

4. 内存操作

进一步解释指针的高级用法,如指针算术和数组指针:

#include <stdio.h>int main() {int arr[3] = {10, 20, 30};  // 定义一个数组int *p = arr;               // 指针p指向数组的第一个元素for (int i = 0; i < 3; i++) {printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));}return 0;
}

解释指针如何与数组结合使用,以及指针算术的含义。

5. 互动练习

让小明自己动手写代码,并进行一些互动练习:

  • 定义变量和指针:让小明定义一些变量和指针,尝试输出变量和指针的值、地址等。
  • 修改指针指向:让小明尝试通过指针修改变量的值,观察变化。

6. 问答和复习

通过问答的形式检查小明的理解情况,并根据他的反馈调整讲解内容。比如:

  • 指针存储的是什么?
  • 如何通过指针访问变量的值?
  • 指针和数组的关系是什么?

通过这些方法,逐步引导小明理解指针的概念和用法,并在实践中巩固所学知识。


这三个问题是理解指针的关键。以下是详细解答:

1. 指针存储的是什么?

指针存储的是另一个变量的地址。换句话说,指针是一个变量,它存放的是某个内存地址,这个地址指向了另一个变量。

例如:

int a = 10;    // 定义一个整数变量 a
int *p = &a;   // 定义一个指针变量 p,并让它指向 a 的地址

在这个例子中,指针p存储的是变量a的内存地址。

2. 如何通过指针访问变量的值?

通过指针可以间接访问指向的变量的值。这可以通过解引用(dereference)操作来实现。解引用运算符是*,放在指针变量前面,表示取出指针指向的变量的值。

例如:

int a = 10;    // 定义一个整数变量 a
int *p = &a;   // 定义一个指针变量 p,并让它指向 a 的地址printf("a 的值:%d\n", a);       // 输出 a 的值,结果是 10
printf("p 的值:%p\n", p);       // 输出 p 的值,即 a 的地址
printf("*p 的值:%d\n", *p);     // 输出 *p 的值,即指针 p 指向的变量 a 的值,结果是 10

在这个例子中,*p表示指针p指向的变量a的值。

3. 指针和数组的关系是什么?

指针和数组有密切的关系,在很多情况下可以互换使用。数组名在表达式中通常会被隐式地转换为指向数组首元素的指针。

例如:

int arr[3] = {10, 20, 30};  // 定义一个数组
int *p = arr;               // 指针 p 指向数组 arr 的首元素

在这个例子中,数组arr的名字arr其实就是一个指向数组第一个元素的指针。所以,parr都指向arr[0]

通过指针可以方便地遍历数组:

int arr[3] = {10, 20, 30};  // 定义一个数组
int *p = arr;               // 指针 p 指向数组的第一个元素for (int i = 0; i < 3; i++) {printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));
}

在这个例子中,arr[i]*(p + i)是等价的,都表示数组的第i个元素的值。

通过这些解释和代码示例,小明应该能够更好地理解指针的存储内容、如何通过指针访问变量的值,以及指针和数组之间的关系。


在C语言中,arr&arr[0]&arr虽然在某些上下文中可以互换使用,但它们确实有不同的含义。下面是详细的解释:

1. arr

  • 数组名arr表示数组名,指向数组的第一个元素。
  • 类型:它的类型是int *,即指向整数的指针。
  • arr的值是数组第一个元素的地址。

例如,对于数组int arr[3] = {10, 20, 30};

int *p = arr;

这里,p指向arr的第一个元素,也就是arr[0]

2. &arr[0]

  • 第一个元素的地址&arr[0]表示数组第一个元素的地址。
  • 类型:它的类型也是int *,即指向整数的指针。
  • &arr[0]arr的值是相同的,都是数组第一个元素的地址。

例如:

int *p = &arr[0];

这里,p同样指向arr的第一个元素。

3. &arr

  • 整个数组的地址&arr表示整个数组的地址。
  • 类型:它的类型是int (*)[3],即指向包含3个整数的数组的指针。
  • &arr的值是数组的起始地址,与arr&arr[0]相同,但类型不同。

例如:

int (*p)[3] = &arr;

这里,p是一个指向包含3个整数的数组的指针。

区别总结

虽然在某些上下文中arr&arr[0]&arr可以互换使用,但它们的类型不同:

  • arr&arr[0] 的类型是 int *
  • &arr 的类型是 int (*)[3],即指向包含3个整数的数组的指针。

具体示例代码展示:

#include <stdio.h>int main() {int arr[3] = {10, 20, 30};// arr 和 &arr[0]int *p1 = arr;        // 等价于 int *p1 = &arr[0];int *p2 = &arr[0];// &arrint (*p3)[3] = &arr;// 打印指针的值printf("arr 的地址:%p\n", (void *)arr);printf("&arr[0] 的地址:%p\n", (void *)&arr[0]);printf("&arr 的地址:%p\n", (void *)&arr);// 打印指针指向的值printf("*p1 的值:%d\n", *p1);         // 10printf("*p2 的值:%d\n", *p2);         // 10printf("*(*p3) 的值:%d\n", *(*p3));   // 10return 0;
}

输出结果:

arr 的地址:0x7ffeebc1c5c0
&arr[0] 的地址:0x7ffeebc1c5c0
&arr 的地址:0x7ffeebc1c5c0
*p1 的值:10
*p2 的值:10
*(*p3) 的值:10

可以看到,arr&arr[0]&arr的地址是相同的,但它们的类型不同。


在C语言中,指针的种类可以根据指向的对象类型和用途来分类。以下是主要的指针种类及其用途:

1. 根据指向的对象类型分类

1.1 基本类型指针
  • 整数指针(int *):指向整数类型变量的指针。

    int a = 10;
    int *p = &a;
    
  • 浮点数指针(float *):指向浮点数类型变量的指针。

    float b = 5.5;
    float *q = &b;
    
  • 字符指针(char *):指向字符类型变量的指针,常用于字符串处理。

    char c = 'A';
    char *r = &c;
    
1.2 复合类型指针
  • 数组指针(指向数组的指针):指向数组的指针,类型为数组的类型。

    int arr[3] = {1, 2, 3};
    int (*p)[3] = &arr;
    
  • 结构体指针(struct *):指向结构体类型变量的指针。

    struct Point {int x;int y;
    };
    struct Point pt = {10, 20};
    struct Point *p = &pt;
    
  • 联合指针(union *):指向联合类型变量的指针。

    union Data {int i;float f;
    };
    union Data data;
    union Data *p = &data;
    

2. 根据用途分类

2.1 空指针(Null Pointer)

空指针不指向任何有效的内存地址,通常用于指针初始化。

int *p = NULL;
2.2 通用指针(Void Pointer)

通用指针可以指向任何类型的变量,但不能直接解引用。

void *p;
int a = 10;
p = &a;
2.3 函数指针

指向函数的指针,用于动态调用函数。

int add(int a, int b) {return a + b;
}
int (*funcPtr)(int, int) = &add;
int result = funcPtr(5, 3);
2.4 野指针(Dangling Pointer)

指向已经被释放的内存地址的指针,是一种危险的指针,可能导致程序崩溃。

int *p = (int *)malloc(sizeof(int));
free(p);
*p = 10;  // 野指针使用
2.5 指针数组

数组中每个元素都是指针。

int *arr[3];
int a = 1, b = 2, c = 3;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
2.6 指向指针的指针(Pointer to Pointer)

指向另一个指针的指针,通常用于多级指针操作。

int a = 10;
int *p = &a;
int **pp = &p;

3. 特殊用途的指针

3.1 常量指针(Pointer to Constant)

指向常量的指针,即不能通过该指针修改所指向的值。

const int a = 10;
const int *p = &a;
3.2 指针常量(Constant Pointer)

指针本身是常量,即指针的地址不能修改。

int a = 10;
int *const p = &a;
3.3 指向常量的常量指针(Constant Pointer to Constant)

指针本身和指针指向的值都不能修改。

const int a = 10;
const int *const p = &a;

通过这些分类和示例,小明可以更清晰地理解指针的多种类型及其用途。


函数指针和指针函数在C语言中是两个不同的概念,尽管它们的名称非常相似。以下是对它们的详细解释:

1. 函数指针

函数指针指向函数的指针,用于动态调用函数。

声明和使用:
  1. 声明函数指针
    函数指针的声明方式是先写出函数的返回类型,然后是指针变量名,指针变量名用括号括起来,后面是参数列表。

    返回类型 (*指针变量名)(参数类型列表)
    
  2. 示例

    int add(int a, int b) {return a + b;
    }int (*funcPtr)(int, int);  // 声明一个函数指针int main() {funcPtr = &add;  // 将函数的地址赋给函数指针int result = funcPtr(5, 3);  // 通过函数指针调用函数printf("Result: %d\n", result);  // 输出结果 8return 0;
    }
    

    在这个示例中,funcPtr是一个指向返回类型为int且有两个int参数的函数的指针。我们将add函数的地址赋给funcPtr,然后通过funcPtr调用add函数。

2. 指针函数

指针函数返回指针的函数

声明和使用:
  1. 声明指针函数
    指针函数的声明方式与普通函数相同,但返回类型是指针类型。

    指针类型 函数名(参数类型列表)
    
  2. 示例

    int* findMax(int* arr, int size) {int* max = arr;for (int i = 1; i < size; i++) {if (*(arr + i) > *max) {max = arr + i;}}return max;
    }int main() {int arr[] = {1, 5, 3, 9, 2};int* max = findMax(arr, 5);printf("Max value: %d\n", *max);  // 输出最大值 9return 0;
    }
    

    在这个示例中,findMax是一个指针函数,它返回一个指向数组中最大元素的指针。

区别总结

  • 函数指针:是一个指向函数的指针变量,用于存储函数的地址并通过它来调用函数。

    • 声明示例:int (*funcPtr)(int, int);
    • 用途:动态调用不同的函数。
  • 指针函数:是一个返回指针的函数,函数的返回类型是一个指针类型。

    • 声明示例:int* findMax(int* arr, int size);
    • 用途:返回指针,通常用于指向某个数据或数组元素。

理解这两者的区别和使用场景,有助于小明更好地掌握C语言中的指针相关知识。


回调函数是一种通过函数指针传递给另一个函数,并在适当时机由后者调用的函数。回调函数在实现灵活和可重用的代码方面非常有用,特别是在事件驱动编程、异步编程和处理多态性时。

回调函数的主要用途

  1. 事件处理:在GUI编程中,按钮点击、键盘输入等事件通常会触发回调函数。
  2. 异步操作:在网络编程中,回调函数可以在异步操作完成时被调用,如网络请求完成、文件读取完成等。
  3. 自定义行为:允许用户在库函数执行时指定自定义的处理逻辑。

回调函数的实现

以下是一个简单的回调函数示例:

  1. 定义回调函数类型
    通过typedef定义一个回调函数类型,方便使用。

    typedef void (*CallbackType)(int);
    
  2. 定义回调函数
    定义一个符合回调函数类型的函数。

    void myCallback(int result) {printf("Callback called with result: %d\n", result);
    }
    
  3. 定义调用回调函数的函数
    定义一个接受回调函数作为参数的函数。

    void performOperation(int a, int b, CallbackType callback) {int result = a + b;// 调用回调函数callback(result);
    }
    
  4. 使用回调函数
    在主函数中使用回调函数。

    int main() {// 调用performOperation,并传递myCallback作为回调函数performOperation(3, 4, myCallback);return 0;
    }
    

完整示例

#include <stdio.h>// 定义回调函数类型
typedef void (*CallbackType)(int);// 定义回调函数
void myCallback(int result) {printf("Callback called with result: %d\n", result);
}// 定义调用回调函数的函数
void performOperation(int a, int b, CallbackType callback) {int result = a + b;// 调用回调函数callback(result);
}int main() {// 调用performOperation,并传递myCallback作为回调函数performOperation(3, 4, myCallback);return 0;
}

解释

  1. 定义回调函数类型

    • typedef void (*CallbackType)(int); 定义了一个名为CallbackType的函数指针类型,它指向返回类型为void,接受一个int参数的函数。
  2. 定义回调函数

    • void myCallback(int result) 是一个简单的回调函数,它接受一个int参数并输出结果。
  3. 定义调用回调函数的函数

    • void performOperation(int a, int b, CallbackType callback) 是一个接受两个整数参数和一个回调函数指针作为参数的函数。它计算两个整数的和,并调用回调函数将结果传递给它。
  4. 使用回调函数

    • main函数中,调用performOperation(3, 4, myCallback),将myCallback函数作为回调传递。当performOperation计算出结果后,它会调用myCallback并将结果传递给它。

通过这种方式,可以实现灵活的函数调用机制,使得代码更加模块化和可重用。

相关文章:

指针并不是用来存储数据的,而是用来存储数据在内存中地址(内存操作/函数指针/指针函数)

推荐&#xff1a;1、4、5号书籍 1. 基本概念 首先&#xff0c;让小明了解指针的基本概念&#xff1a; 指针的定义&#xff1a;指针是一个变量&#xff0c;它存储的是另一个变量的地址。指针的声明&#xff1a;例如&#xff0c;int *p表示一个指向整数的指针变量p。 2. 形象…...

iso21434认证的意义

ISO 21434认证对于汽车行业具有深远的意义&#xff0c;主要体现在以下几个方面&#xff1a; 确保汽车网络安全&#xff1a;ISO 21434认证旨在确保汽车在设计和制造过程中能够抵御潜在的网络威胁和攻击。通过遵循该标准&#xff0c;汽车制造商能够开发出具备可靠网络安全能力的…...

分页处理封装+分页查询题目列表

文章目录 1.sun-club-common封装分页1.com/sunxiansheng/subject/common/eneity/PageInfo.java2.com/sunxiansheng/subject/common/eneity/PageResult.java 2.sun-club-application-controller1.SubjectInfoDTO.java 继承PageInfo并新增字段2.SubjectController.java 3.sun-clu…...

每天一个项目管理概念之WBS

项目管理中的工作分解结构&#xff08;Work Breakdown Structure&#xff0c;简称WBS&#xff09;是规划和管理项目的核心工具之一&#xff0c;它通过将复杂的项目任务细分为更小、更易管理的部分来提高项目执行的效率与效果。WBS不仅有助于明确项目范围&#xff0c;还为时间管…...

linux安装mysql8并查看密码

1. **下载RPM包**&#xff1a; wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 2. **安装RPM包**&#xff1a; sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm 3. **更新YUM缓存**&#xff1a; sudo yum makecache 4. **安装…...

[渗透测试] 任意文件读取漏洞

任意文件读取漏洞 概述 漏洞成因 存在读取文件的功能&#xff08;Web应用开放了文件读取功能&#xff09;读取文件的路径客户端可控&#xff08;完全控制或者影响文件路径&#xff09;没有对文件路径进行校验或者校验不严格导致被绕过输出文件内容 漏洞危害 下载服务器中的…...

sudo: /etc/init.d/ssh: command not found

在 WSL 中尝试启动 SSH 服务时遇到 sudo: /etc/init.d/ssh: command not found 错误 安装 OpenSSH 服务器 更新软件包列表 sudo apt update安装 OpenSSH 服务器 sudo apt install openssh-server启动 SSH 服务 在 WSL 2 上,服务管理与传统 Linux 系统有所不同。你可以手动启动…...

秋招倒计时?到底需要准备到什么程度?

秋招倒计时&#xff1f;需要准备到什么程度&#xff1f; 秋招&#xff0c;面向全国的毕业生&#xff0c;招聘的激烈程度可想而知&#xff01;按照往年时间&#xff0c;秋招通常从八月初开始&#xff0c;九月黄金期&#xff0c;十月中后期。距今刚好差不多60天&#xff0c;时间其…...

6.26.4.1 基于交叉视角变换的未配准医学图像多视角分析

1. 介绍 许多医学成像任务使用来自多个视图或模式的数据&#xff0c;但很难有效地将这些数据结合起来。虽然多模态图像通常可以在神经网络中作为多个输入通道进行配准和处理&#xff0c;但来自不同视图的图像可能难以正确配准(例如&#xff0c;[2])。因此&#xff0c;大多数多视…...

62.指针和二维数组(2)

一.指针和二维数组 1.如a是一个二维数组&#xff0c;则数组中的第i行可以看作是一个一维数组&#xff0c;这个一维数组的数组名是a[i]。 2.a[i]代表二维数组中第i行的首个元素的地址&#xff0c;即a[i][0]的地址。 二.进一步思考 二维数组可以看作是数组的数组&#xff0c;本…...

学生表的DDL和DML

DDL -- 创建学生表 CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,studentname VARCHAR(50),age INT,gender VARCHAR(10) );-- 创建课程表 CREATE TABLE courses (course_id INT PRIMARY KEY AUTO_INCREMENT,course_name VARCHAR(50) );-- 创建教师表 CR…...

视觉灵感的探索和分享平台

做设计没灵感&#xff1f;大脑一片空白&#xff1f;灵感是创作的源泉&#xff0c;也是作品的灵魂所在。工作中缺少灵感&#xff0c;这是每个设计师都会经历的苦恼&#xff0c;那当我们灵感匮乏的时候&#xff0c;该怎么办呢&#xff1f;别急&#xff0c;即时设计、SurfCG、Lapa…...

使用 Reqable 在 MuMu 模拟器进行App抓包(https)

1、为什么要抓包&#xff1f; 用开发手机应用时&#xff0c;查看接口数据不能像在浏览器中可以直接通过network查看&#xff0c;只能借助抓包工具来抓包&#xff0c;还有一些线上应用我们也只能通过抓包来排查具体的问题。 2、抓包工具 实现抓包&#xff0c;需要一个抓包工具…...

RedisConnectionException: Unable to connect to localhost/<unresolved>:6379

方法一&#xff1a;删除配置密码选项 一般是因为你在启动redsi服务的时候没有以指定配置文件启动 把application.yml文件中的redis密码注释掉 方法二 以指定配置文件启动 这样就不用删除yml文件中密码的选项了 在redis,windows.conf 中找到requirepass&#xff0c;删除掉前…...

poi word写入图片

直接使用的百度结果&#xff0c;经过测试可行 1.pom增加jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apach…...

【监控】2.Grafana的安装

在 macOS 上部署 Grafana 和 Prometheus 来监控 Java 服务是一个非常实用的操作。以下是详细的步骤&#xff0c;包括如何安装和配置 Prometheus、Grafana 以及在 Java 服务中集成 Prometheus 的客户端库来收集指标数据。 1. 安装 Grafana 1.1 使用 Homebrew 安装 Grafana br…...

Java入门教程(上)

Java入门教程&#xff08;上&#xff09; Java是一种流行的面向对象编程语言&#xff0c;以其简洁、可移植和强大的特性&#xff0c;被广泛应用于各种软件开发领域。对于初学者来说&#xff0c;掌握Java的基础知识和编程技巧是非常重要的。本文将带你从零开始学习Java&#xf…...

【Linux】Linux下使用套接字进行网络编程

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 用于网络应用开…...

强化学习-Q-learning、SARSA和PPO等算法

强化学习 强化学习是一种机器学习方法&#xff0c;它关注智能体如何通过与环境的交互来最大化期望的累积奖励。在这个过程中&#xff0c;智能体不断尝试不同的行为策略&#xff0c;并根据结果调整策略&#xff0c;以提高长期的性能。以下是几种常见的强化学习算法&#xff1a;…...

HarmonyOS SDK助力鸿蒙原生应用“易感知、易理解、易操作”

6月21-23日&#xff0c;华为开发者大会&#xff08;HDC 2024&#xff09;盛大开幕。6月23日上午&#xff0c;《HarmonyOS开放能力&#xff0c;使能应用原生易用体验》分论坛成功举办&#xff0c;大会邀请了多位华为技术专家深度解读如何通过根技术、开放能力、场景化控件等亮点…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...