民办生从零学C的第十二天:指针(1)
每日励志:拼搏十年,征战沙场,不忘初心,努力成为一个浑身充满铜臭味的有钱人。
一.内存和地址
1.内存
计算机内存是一系列存储单元的集合,每个存储单元都有唯一的地址来标识。这些存储单元用于存储程序的数据和指令。内存可以被看作是一个巨大的数组,地址就像是这个数组的索引,通过地址可以找到对应的存储单元。内存分为一个一个的内存单元,每一个内存单元的大小是一个字节,一个字节等于8bit。(一个比特位可以存储一个2进制的位1或者0)
2.地址
地址是内存单元的编号,用于定位内存中的数据。在 C 语言中,当我们声明一个变量时,系统会自动为该变量分配一块内存区域,变量的地址就是这块内存区域的起始位置。
可以类比为一个宿舍楼(内存),一个内存单元就是一个宿舍,而8bit就是8个人,同时,每一个宿舍号就是地址
3.指针
指针是一个变量,它的值是另一个变量的地址。
例如: int a = 10
int * p = &a;
这里,p 是一个指针变量,&a 表示变量 a 的地址。
指针 p 存储的就是变量 a 在内存中的地址。
通过指针,可以间接访问和操作内存中的数据,即通过指针可以修改变量 a 的值。
变量创建的实质是向内存申请相应空间来存储数据,例如定义int a = 10时,就是在内存里申请 4 个字节的空间去放置数值 10,而这 4 个字节的每个单元都有独一无二的地址编号。在程序中,我们所设置的变量名,其实主要是为了方便程序员自身识别和操作,编译器在实际处理时并不会识别变量名,它依据的是内存地址来精准定位并操作对应的内存单元。
二.指针变量
1.取地址操作符 & 与解引用操作符 * (间接访问操作符)
在C语言中创建交量其实就是向内存申请空问,例如我们在创建int a = 10时就是在内存里申请 4 个字节的空间去放置数值 10,每一个字节都有地址
这个时候通过 & 便可以获得地址(第一个字节的地址),剩下的三个地址随之而然也可以得知
#include <stdio.h>
int main()
{int a = 10;int *pa = &a;*pa = 20;printf("%d\n",a);printf("%p\n",&a);return 0;
}//第一个printf输出的是20,这是因为通过指针pa修改了变量a的值。//第二个printf输出的是变量a的内存地址,不同设备和运行环境输出会有所不同
2.指针类型
例如: int a = 10
int * pa = &a;
*pa = 20;
int * ,是在说明pa是指针变量,int 是在说明pa指向的是整型(int)类型的对象, *pa 是表示指针pa指向的内存地址中存储的值,*pa = 20 是将pa指向的地址处存储的值改为20。
3.指针地址大小
32位平台下地址是32个bit位(即4个字节),而64位平台下地址是64个bit位(即8个字节)
指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。
三.指针的解引用
1.
#include <stdio.h>
int main()
{int n = 0x11223344;printf("初始值:n = 0x%X\n", n);printf("n的地址:&n = %p\n", &n);int *pi = &n;printf("解引用pi前:*pi = 0x%X\n", *pi);*pi = 0;printf("解引用pi后:*pi = 0x%X\n", *pi);// 分别输出每个字节的值unsigned char *byte_ptr = (unsigned char *)&n;printf("修改后n的每个字节值(按字节拆分):");for (int i = 0; i < sizeof(n); i++) {printf("0x%02X ", byte_ptr[i]);}printf("\n");return 0;
}
#include <stdio.h>
int main()
{int n = 0x11223344;printf("初始值:n = 0x%X\n", n);printf("n的地址:&n = %p\n", &n);char *pc = (char *)&n;printf("解引用pc前:*pc = 0x%02X\n", *pc);*pc = 0;printf("解引用pc后:*pc = 0x%02X\n", *pc);// 分别输出每个字节的值unsigned char *byte_ptr = (unsigned char *)&n;printf("修改后n的每个字节值(按字节拆分):");for (int i = 0; i < sizeof(n); i++) {printf("0x%02X ", byte_ptr[i]);}printf("\n");return 0;
}
我们可以观察到代码1会将n的4个字节全部改为0,但是代码2只是将n的第一个字节改为0
char * 的指针解引用就只能访问一个字节,而 int * 的指针的解引用就能访问四个字节。由此可知,指针的类型决定了指针解引用的时候能够一次操作几个字节
2.void * 指针
它是通用指针,不指向特定数据类型。它不能直接解引用,需强制转换为目标类型指针后才能操作。常用于函数参数部分,用来接收不同类型数据的地址。
#include <stdio.h>int main()
{int age = 520;double price = 13.14;char initial = 'A';// 使用void指针指向不同类型的变量void* ptr;// 将int变量的地址赋给void指针ptr = &age;printf("使用void指针访问int变量的值:%d\n", *(int*)ptr);// 将double变量的地址赋给void指针ptr = &price;printf("使用void指针访问double变量的值:%.2f\n", *(double*)ptr);// 将char变量的地址赋给void指针ptr = &initial;printf("使用void指针访问char变量的值:%c\n", *(char*)ptr);return 0;
}
四.const修饰指针
1.const修饰变量
变量是可以修改的,如果我们把变量的地址交给一个指针变量,我们也可以通过这个指针变量来修改这个变量,但如果我们不希望这个变量被修改,那么我们就引进 const 来限制
1.
int n = 0;
n = 20;
2.
const int m = 0;
m = 20;(编译器会报错)
const的限制是语法层面的限制,所以在2中如果对m进行修改就报错。但是我们可以通过指针绕过const的限制
#include <stdio.h>int main()
{const int m = 0;printf("%d\n",m);int *pm = &m;*pm = 100;printf("%d\n",m);return 0;
}
同时,在const修饰变量的时候,这个被修饰的变量本质上还是变量,叫做变常量,只不过它不能被修改。
2.const修饰指针变量
可以放在 * 的左边,也可以故在 * 的右边,
a.const 放在指针声明的左边
当 const 放在指针声明的左边时,表示指针指向的数据是常量,不能通过该指针修改其值。指针本身仍然可以指向其他地址。
#include <stdio.h>int main()
{int num1 = 520;int num2 = 1314;const int *p = &num1; // 指针指向的值是常量printf("通过指针访问num1的值: %d\n", *p); // 可以访问值// *p = 100; // 错误:不能通过指针修改值// 可以改变指针指向的地址p = &num2;printf("通过指针访问num2的值: %d\n", *p);return 0;
}
b. const 放在指针声明的右边
当const放在指针声明的右边时,表示指针本身是常量,不能改变它指向的地址。但是可以通过指针修改指向地址的值。
#include <stdio.h>int main()
{int num1 = 520;int num2 = 1314;int *const p = &num1; // 指针本身是常量printf("通过指针访问num1的值: %d\n", *p); // 可以访问值*p = 100; // 可以通过指针修改值printf("修改后通过指针访问num1的值: %d\n", *p);// p = &num2; // 错误:不能改变指针指向的地址return 0;
}
五.指针运算
分别有三种:
- 指针+-整数
- 指针-指针
- 指针的关系运算
1.指针 + / - 整数
- 含义:指针和整数相加或相减,会改变指针的值,使其指向数组中前后的元素。
- 规则:指针指向某种数据类型,当指针和整数n相加或相减时,指针的值会增加或减少n个该数据类型所占的字节数。(由指针类型决定+-1的步长)
#include <stdio.h>int main()
{int arr[] = {10, 20, 30, 40, 50};int *p = arr; // 指向数组第一个元素printf("arr[0] = %d\n", *p); // 输出10p = p + 2; // 指向arr[2]printf("arr[2] = %d\n", *p); // 输出30p = p - 1; // 指向arr[1]printf("arr[1] = %d\n", *p); // 输出20return 0;
}
#include <stdio.h>int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,10};// 数组索引 0 1 2 3 4 5 6 7 8 9int i =0;int sz = sizeof(arr)/sizeof(arr[0]);int * p = &arr[0];for(i = 0; i<sz;i++){printf("%d ",*p);p++;}return 0;
}
2.指针 - 指针
-
含义:两个指针相减的绝对值,得到它们之间的元素个数。
-
规则:两个指针都指向同一种数据类型,相减的结果是它们在内存中所指向元素的个数之差。
#include <stdio.h>int main() {int arr[] = {10, 20, 30, 40, 50};int *p1 = arr; // 指向arr[0]int *p2 = arr + 3; // 指向arr[3]int difference = p2 - p1;printf("指针之间的元素个数: %d\n", difference); // 输出3return 0;
}
数组名其实是数组首元素的地址
为什么没有指针加指针呢?
因为指针加指针就像日期加日期一样没有意义
eg 还原 strlen函数
#include <stdio.h>size_t my_strlen(char*p)
{char* start = p;char* end = p;while(*end != '\0'){end++;}return end - start;
}int main()
{char arr[] = "abcdefg";// a b c d e f g \0size_t len = my_strlen(arr);//数组名其实是数组首元素的地址 arr == &arr[@]printf("%zd\n",len);return 0;
}
3.指针的关系运算
-
含义:比较两个指针的大小,判断它们指向的内存位置的前后关系。
-
规则:两个指针都指向同一种数据类型,可以使用关系运算符(==、!=、>、<、>=、<=)进行比较。
#include <stdio.h>int main()
{int arr[] = {10, 20, 30, 40, 50};int *p1 = arr; // 指向arr[0]int *p2 = arr + 2; // 指向arr[2]if (p1 < p2) {printf("p1 < p2\n");} else if (p1 == p2) {printf("p1 == p2\n");} else {printf("p1 > p2\n");}int *p3 = arr + 1;if (p3 != p2) {printf("p3 != p2\n");}return 0;
}
六.野指针
它指的是一个指针指向了一个已经被释放或者无效的内存地址。野指针的存在会导致程序行为不可预测,可能会引发崩溃或数据损坏。
1.指针未初始化
#include <stdio.h>int main()
{int *p; // 声明一个指针,但未初始化// 尝试访问指针指向的值printf("指针p指向的值: %d\n", *p);return 0;
}
当我们尝试访问 *p 时,程序可能会崩溃,或者输出一个随机的值,因为p指向的内存地址未被程序合法使用。
2.指针越界访问
#include <stdio.h>int main()
{int arr[3] = {10, 20, 30}; // 定义一个大小为3的数组int *ptr = arr; // 指针初始化为数组首地址// 正常访问数组元素printf("arr[0] = %d\n", *ptr); // 输出10printf("arr[1] = %d\n", *(ptr + 1)); // 输出20printf("arr[2] = %d\n", *(ptr + 2)); // 输出30// 越界访问,尝试访问arr[3]printf("越界访问arr[3] = %d\n", *(ptr + 3)); return 0;
}
使用*(p + 3)尝试访问 arr[3],这超出了数组的实际大小(数组只有3个元素,索引为0、1、2)。这种越界访问会导致未定义行为,可能读取到随机值或引发程序崩溃。
相关文章:
民办生从零学C的第十二天:指针(1)
每日励志:拼搏十年,征战沙场,不忘初心,努力成为一个浑身充满铜臭味的有钱人。 一.内存和地址 1.内存 计算机内存是一系列存储单元的集合,每个存储单元都有唯一的地址来标识。这些存储单元用于存储程序的数据和指令。…...
复习Vue136~180
1.使用create-vue创建项目 npm init vuelatest 项目目录和关键文件: new Vue() 创建一个应用实例 > createApp()、createRouter() createStore() 、将创建实例进行了封装,保证每个实例的独立封闭性。 禁用vue2的插件vuter 使用vue3的插件volar scrip…...
高炉项目中DeviceNET到Ethernet的转换奥秘
在工业自动化的世界中,高炉项目中的数据通信至关重要。其中DeviceNET和Ethernet作为两种主流的网络协议,扮演着不可或缺的角色。它们之间的转换不仅仅是技术上的桥梁,更是实现信息高效传递的关键。今天,我们就来揭开从DeviceNET到…...
awk之使用详解(Detailed Explanation of Using AWK)
awk使用详解 1. 入门 1.1 什么是 awk? ①Awk是一种文本处理工具,适用于处理结构化数据,例如表格数据。 ②它可以读取一个或多个文本文件,并执行模式扫描和处理等指定的操作。 ③基本逻辑涉及数据的提取,排序和计算…...
TDR阻抗会爬坡? 别担心,不是你的错,你只是不够了解TDR!
在背板系统或任何长走线设计里,你大概都碰过这画面: TDR 曲线一开始乖乖在 92 Ω,但越往末端、阻抗越爬越高,来到最高 97 Ω,心里瞬间凉半截 😒 ,「难不成... 板厂又翻车了吗?」 然…...
TypeScript之基础知识
基础知识 1. 基本类型 类型描述string字符串(如 "hello")number数字(整数或浮点数,支持二进制、八进制、十六进制)boolean布尔值(true/false)null空值(需显式声明&#x…...
SNMP协议之详解(Detailed Explanation of SNMP Protocol)
SNMP协议之详解 一、前言 SNMP,被形象地喻为网络世界大的工具箱,使他们能的“智慧守护者”,它为网络管理员装备了一套功能强够实现对网络设备状态的实时监控、性能数据的全面收集、远程配置的灵活管理以及故障事件的即时响应。借助SNMP&…...
机器学习-入门-线性模型(2)
机器学习-入门-线性模型(2) 3.4广义线性回归 一般形式: y g − 1 ( w T x b ) y g^{-1} \left( w^T x b \right) yg−1(wTxb) 单调可微的联系函数 (link function) 令 g ( ⋅ ) ln ( ⋅ ) g(\cdot) \ln (\cdot) g(⋅)ln(⋅) 则得到对数线性回归 ln …...
【问题】docker容器修改环境变量的方式
问题 启动n8n之后,docker容器提示: There is a deprecation related to your environment variables. Please take the recommended actions to update your configuration: 2025-04-28 09:20:08 - N8N_RUNNERS_ENABLED -> Running n8n without tas…...
基于 Spring Boot 瑞吉外卖系统开发(八)
基于 Spring Boot 瑞吉外卖系统开发(八) 自动填充公共字段 MyBatis-Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,降低了冗余代码的数量。本…...
LeetCode热题100--560.和为K的子数组(前缀和)--中等
1.题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2 示例 2: 输入:nums […...
搭建 Spark YARN 模式集群指南
在大数据处理领域,Apache Spark 凭借其卓越的性能和易用性广受青睐。而 YARN(Yet Another Resource Negotiator)作为 Hadoop 的资源管理框架,能高效管理集群资源。将 Spark 与 YARN 结合,以 YARN 模式搭建集群…...
服务器部署,Nginx安装和配置
Nginx简介 Nginx是一款轻量级和高性能的web服务器、反向代理服务器和电子邮件代理服务器。你可以使用Nginx实现网页的部署,解决跨域问题实现邮件服务器,甚至Nginx也可以实现音视频推流拉流服务器,Nginx可以实现的功能远超你的想象࿰…...
Java后端接口调用拦截处理:注解与拦截器的实现
在Java开发中,对后端接口调用进行拦截处理是一种常见的需求,通常用于权限验证、Token校验、状态更新等操作。本文将围绕 Spring框架的拦截器(Interceptor)、Spring AOP(面向切面编程) 和 Spring Security 三…...
C++(初阶)(十四)——多态
多态 面向对象的其中一大特征。 多态多态的定义及构成多态的构成条件多态的实现条件多态的分类编译时多态性运行时的多态性 虚函数定义不能成为虚函数的函数 虚函数重写(覆盖)选择题虚函数重写的其他问题析构函数的重写override 和final关键字重载/重写…...
PyQt6基础_QThread
目录 前置 代码: 运行 正常运行 QThread运行报错 视频 前置 1 PySide6.QtCore.QThread - Qt for Python QThread官方文档 2 长时间任务可以放到QThread中执行,避免占用主线程导致界面卡顿无法操作 代码: import traceback,sys fro…...
工业通讯现场中关于EtherCAT转TCPIP网关的现场应用
在当今工业自动化的浪潮中,EtherCAT技术以其高效、实时的特性成为了众多制造业的首选。然而,随着工业互联网的发展,对于数据的远程访问和云平台集成的需求日益增长,这就需要将EtherCAT协议转化为更为通用的TCP/IP协议。于是开疆智…...
vite创建vue3项目并进行配置
创建项目 方式一 执行以下命令 之后输入项目名称 选择框架 选择语言 例如 pnpm create vite此方式创建的项目较为干净 0手起步 只包含一些基础依赖 例如vue vite等 项目目录如下 "scripts": {"dev": "vite","build": "vue-tsc -…...
LeetCode 热题 100_最小路径和(92_64_中等_C++)(多维动态规划)
LeetCode 热题 100_最小路径和(92_64) 题目描述:输入输出样例:题解:解题思路:思路一(多维动态规划): 代码实现代码实现(思路一(多维动态规划&…...
关于常量指针和指向常量的指针
关于指针,对于常量指针和指向常量的指针也是傻傻分不清。看到定义时,不知道是指针不能变,还是指针指向的内容不能变量。 先看形式: const char * A; char * const B; 这两种有什么区别?傻傻分不清。 A这种定义&am…...
新时代下的存储过程开发实践与优化
随着现代应用系统的复杂度不断增加,数据库作为核心的数据存储和处理引擎,其性能和可靠性显得尤为重要。存储过程(Stored Procedure)作为一种封装在数据库中的应用逻辑,使得开发者能够在数据库层面实现数据操作、数据校…...
4月28日日记
2025年4月28日 星期一 晴 今天过得格外充实,也充满了收获与喜悦。 下午,我参加了学校的五四述职大会。各个学院的团委书记依次上台,汇报过去一年的工作成果。看着大家在台上分享着各自学院的精彩故事,我深受触动。他们所展示的活…...
大模型性能测试
当我们部署了大模型并对外提供服务时,我们通常都想了解一下大模型能够支持多少个并发访问,在不同的并发数下,模型的性能如何。了解这些信息有助于我们更好的对算力进行评估,为用户带来更好的性能体验。 大模型通常是通过API接口的…...
利用 Google Earth Engine 探索江宁区 2010 - 2020 年 EVI 时空变化
引言 增强型植被指数(Enhanced Vegetation Index,EVI)是一种用于量化植被生长状态和覆盖程度的重要指标,它在监测植被动态、生态环境评估以及气候变化研究等领域发挥着关键作用。Google Earth Engine(GEE)…...
IEC 61850标准协议解读 2.基于Java的MMS实现
专栏文章目录 第一章 IEC 61850标准协议解读 0.导言 第二章 IEC 61850标准协议解读 1.建模讲解 第三章 IEC 61850标准协议解读 2.基于Java的MMS实现 目录 专栏文章目录前言1 依赖库引入2 创建服务端3 创建客户端4 读写模型4.1 服务端读写4.2 客户端读写 5.报告6 文件服务6.1 读…...
花费7元训练自己的GPT 2模型
在上一篇博客中,我介绍了用Tensorflow来重现GPT 1的模型和训练的过程。这次我打算用Pytorch来重现GPT 2的模型并从头进行训练。 GPT 2的模型相比GPT 1的改进并不多,主要在以下方面: 1. GPT 2把layer normalization放在每个decoder block的前…...
【android bluetooth 协议分析 06】【l2cap详解 10】【通过avdtp连接流程,感受l2cap通道的生命周期变化】
本篇我们通过分析一个具体的实例,来直观感受一下 l2cap 中通道的 状态变化。 1. 环境描述: 车机: a2dp sink手机: a2dp source场景: 手机主动 触发 连车机 声明一下: 分析的btsnoop 和 logcat 还有源码,…...
如何在idea中写spark程序。
要在IntelliJ IDEA中编写Spark程序,你可以按照以下步骤进行: 1. 安装和配置Java:确保你的计算机上已经安装了Java Development Kit (JDK),并且已配置好 JAVA_HOME 环境变量。 2. 安装IntelliJ IDEA:下载并安装Inte…...
Pytest-mark使用详解(跳过、标记、参数 化)
1.前言 在工作中我们经常使用pytest.mark.XXXX进行装饰器修饰,后面的XXX的不同,在pytest中有不同的作 用,其整体使用相对复杂,我们单独将其抽取出来做详细的讲解。 2.pytest.mark.skip()/skipif()跳过用例 import pytest #无条…...
[Android] GKD v1.10.3
[Android] GKD 链接:https://pan.xunlei.com/s/VOOwKvmwpLoLl7fLi6wJZKK-A1?pwd8mey# GKD(详情请戳 作者项目地址)是一款免费开源简洁多规则的自动跳过广告的软件,整体基于kotlin开发,免root即可使用。简而言之&am…...
C22-作业练习之最大公约数与最小公倍数
作业练习之最大公约数与最小公倍数 代码 #include <stdio.h> int main() {//变量初始化int m,n;int i,gcd,lcm;//数据录入printf("请输入两个整数:");scanf("%d %d",&m,&n);//求最大公约数int min(m<n)?m:n; //找m与n的最小值for(imi…...
信号完整性简介第一篇
本章将讲述信号完整性相关问题。首先提出什么是高速系统设计中的信号完整性,其次结合影响信号完整性的各种因素,深入讨论在高速系统设计过程中会碰到的几类信号完整性问题,并对每一类问题提出相应的预防措施和解决方案。 需要说明࿰…...
Qt开发环境的安装与问题的解决(2)
文章目录 1. Qt开发环境安装的说明2. 通过安装包进行安装3. 通过在线下载程序 解决问题下载 https....网路错误问题解决开始安装--第一部分开始安装--第二部分 4. 建议配置环境变量(非必须)配置环境变量的意义 简介:这篇文章主要分享Qt开发环…...
STM32 ADC模数转换器
一、ADC简介 ADC(Analog-Digital Converter)模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁12位逐次逼近型ADC,1us转换时间 输入电压范围:0~3.3V&#x…...
World of Warcraft [CLASSIC] Hunter[Grandel] R12
World of Warcraft [CLASSIC] Hunter[Grandel] R12 R13,[Freeblue] 可惜当时没有截图,唉,没有纪念 --- 挂机脚本...
kalibr:相机模型
文章目录 📚简介Kalibr标定支持的相机模型及适用场景📌 针孔相机模型(Pinhole)🌐 全向相机模型(Omnidirectional)🔍 特殊模型💡 选型建议⚠️ 注意事项📚简介 Kalibr作为多传感器标定的重要工具,支持多种相机模型以适应不同光学特性的视觉传感器。其核心相机…...
【AI News | 20250428】每日AI进展
AI Repos 1、dyad Dyad 是一款免费开源的本地化 AI 应用开发工具,兼容 Windows 和 Mac 双平台。支持使用自有 API 密钥灵活调用主流 AI 模型(包括 Gemini、GPT-4.1、Claude 等),内置数据库与身份验证系统可快速构建完整应用。 …...
DNS区域的类型
在BIND9中,type 用于定义DNS区域的类型,不同的类型决定了BIND如何处理该区域的DNS数据。以下是主要的类型及其作用详解: 1. master(主区域) 作用: 表示该区域是权威DNS服务器的主副本,负责存储…...
HTTP vs HTTPS:传输协议的安全演进与核心差异
HTTP(HyperText Transfer Protocol)和HTTPS(HTTP Secure)作为两种最常用的协议,其安全性和实现方式直接关系到用户隐私和数据完整性。 目录 一、HTTP与HTTPS的基础概念 二、HTTP与HTTPS的核心差异 …...
Android平台Unity引擎的Mono JIT机制分析
一、分析背景 Unity引擎开发游戏采用了C#语言,Unity采用了Mono的Jit机制实现C#逻辑代码动态编译和执行,Mono属于开源的工程,可通过查看Mono源码了解其中的处理。本文针对Mono的Jit动态编译和执行的机制进行分析,更好的了解Unity引擎在Android平台所采用的处理方式。 二、M…...
【java】接口
一、定义 1.接口中所有方法都是抽象方法和公共方法(可以省略 abstract、public),不可以有正常的方法,所有变量都是全局静态常量 2.能继承接口的只能是接口 3.接口和类的关系通过实现(重写(实现)…...
Vuex(二) —— 用Vuex完成购物车案例
目录 需求需求分析 组件分析组件通信 开发 准备环境准备模块结构商品列表组件 展示商品列表添加购物车 我的购物车组件 购物车列表商品数量和统计功能删除购物车商品 购物车列表组件 购物车列表全选操作数字加减并统计小计删除功能统计总数量和总钱数处理金额小数的问题 本地存…...
数字孪生的浪潮:从虚拟镜像到现实世界的 IT 变革
文章目录 数字孪生的本质:物理与虚拟的实时镜像数字孪生的演进:从工业试验到全行业热潮核心技术:数字孪生的基石与工具链物联网(IoT):数据采集云计算与大数据:模型存储AI 与机器学习:…...
Web开发之三层架构
实例: 分层解耦 耦合:衡量软件中各个层/各个模块的依赖关联程度。 内聚:软件中各个功能模块内部的功能联系。 软件设计原则:高内聚低耦合 控制反转:Inversion 0f Control,简称IQC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为…...
社交电商和泛娱乐平台出海南美市场支付方式与策略
随着中国社交电商和泛娱乐平台加速全球化布局,南美市场凭借庞大的人口基数、快速增长的互联网渗透率和活跃的社交媒体使用率,成为出海企业的重要战略要地。然而,这片"新蓝海"的支付生态复杂多元,信用卡欺诈率高企,现金支付仍占主导,不同国家支付偏好差异显著。…...
Miniconda Windows10版本下载和安装
Miniconda Windows10版本下载和安装 步骤1:Miniconda3下载和安装 # 1、下载地址(Windows 64位) https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe #2、双击进行安装 # 安装注意事项: 1. 安装路径建议&a…...
编译原理:由浅入深从语法树到文法类型
文法与语言基础:从语法树到文法类型 文法(Grammar)和语言(Language)是计算机科学和语言学中解析和理解语言结构的核心概念。无论是编程语言的编译器设计,还是自然语言处理(NLP)中的…...
初识Python
哈哈哈,为了让初学者对python进一步了解,懒惰的博主特地去问了AI,如何更加形象的形容python这一么语言 🌟 Python 是什么? 想象一下,编程语言是一群性格各异的人: C语言:穿格子衫的…...
C++ —— 正向迭代器与反向迭代器
目录 1. 正向迭代器(Forward Iterator) 1.1 基本概念 1.2 核心特性 1.3 典型使用 1.4 重要特点 2. 反向迭代器(Reverse Iterator) 2.1 基本概念 2.2 核心特性 2.3 典型使用 2.4 重要特点 3. 正反迭代器对比 4. 正反迭代…...
FDA会议类型总结
1. 会议类型及目的 1.1 Type A会议 1.1.1 争议解决会议 用于解决药物研发过程中与FDA产生的争议,明确双方分歧点。 通过讨论达成共识,避免因争议影响研发进度。 1.1.2 临床保留讨论会议 针对临床试验中出现的问题进行讨论,决定是否保留临床试验。 综合评估临床试验的安全性…...