1 字符指针

1.1 概述

        字符指针变量(简称字符指针)是 C 语言中的一种指针类型,用于指向字符或字符串(字符数组、字符串字面量)。字符指针通常用于处理字符串(字符数组),可以方便地进行字符串的读取、修改和传递。

1.2 定义格式

        字符指针的定义方式与其它类型的指针类似,只是类型指定为 char

char *charPtr;  // charPtr 是一个指向 char 类型的指针。

1.3 指向字符变量

        字符指针 char * 可以指向一个 char 类型的变量,并通过解引用操作符 * 来访问修改该变量的值

#include <stdio.h>int main()
{// 定义一个字符变量char ch = 'A';// 定义一个字符指针,并让它指向字符变量char *ptr = &ch;// 第一次输出:初始值和地址printf("Character: %c, Address: %p\n", *ptr, (void *)ptr);// 通过解引用指针修改字符变量的值*ptr = 'B'; // 只是修改内容,没有改变指针的指向printf("Modified character: %c, Address: %p\n", *ptr, (void *)ptr); // 地址不变// 定义一个新的字符变量char newChar = 'C';// 修改指针的指向ptr = &newChar;// 输出新指向的字符及其地址printf("New character: %c, Address: %p\n", *ptr, (void *)ptr); // 地址改变return 0;
}

        程序在 VS Code 中的运行结果如下所示:

提示:

        指针是一个变量,它保存的是地址;可以通过指针修改它指向的数据内容,但并不会改变指针本身的地址;只有当让指针指向另一个变量时,它的值(地址)才会改变。 

1.4 指向字符数组

        字符指针不仅可以指向单个字符,也可以指向整个字符串(字符数组),并且可以通过标准库函数如 strlen() 对其进行操作。只要指针指向的是以 '\0' 结尾的有效字符串,它就可以当作字符串来使用

#include <stdio.h>
#include <string.h>int main()
{// 定义字符数组char str[] = "Hello, World!";// 定义字符指针并保存原始位置char *ptr = str;char *originalPtr = ptr; // 保存原始位置// 使用指针遍历字符串并逐个打印字符printf("字符串内容: ");while (*ptr != '\0'){printf("%c", *ptr);ptr++; // 最后指针会指向 '\0'}printf("\n");// 输出长度信息printf("字符数组 str 的长度(不包括 '\\0'): %zu\n", strlen(str));printf("字符指针 originalPtr 所指向字符串的长度: %zu\n", strlen(originalPtr));return 0;
}

        程序在 VS Code 中的运行结果如下所示:

1.5 指向字符串字面量

        字符串字面量(如 "Hello, World!")在 C 语言中是存储在只读内存段的常量字符串

        直接使用字符指针指向这些字符串是合法的,但尝试修改其内容会导致未定义行为

        因此,建议在声明字符指针时使用 const 关键字修饰,以明确表示所指向的内容不可修改。

#include <stdio.h>
#include <string.h>int main()
{// 使用字符数组定义字符串char arrayStr[] = "Hello, Array!";// 使用字符指针定义字符串(指向字符串字面量)// 注意:字符串字面量是只读的,不能修改const char *pointerStr = "Hello, Pointer!";// 输出原始字符串printf("字符数组定义的字符串: %s\n", arrayStr);     // Hello, Array!printf("字符指针定义的字符串: %s\n\n", pointerStr); // Hello, Pointer!// 修改字符数组中的内容printf("1. 单个字符修改很麻烦,需要注意字符串的结束符\n");arrayStr[7] = '1';arrayStr[8] = '2';arrayStr[9] = '3';printf("没添加结束符的情况:%s\n", arrayStr); // Hello, 123ay!arrayStr[10] = '\0';printf("添加字符串结束符后:%s\n\n", arrayStr); // Hello, 123// 使用 strcpy 函数修改字符串printf("2. 使用 strcpy 函数修改字符串,注意字符数组的长度\n");strcpy(arrayStr, "new Array!");printf("使用 strcpy 函数修改后的字符数组: %s\n", arrayStr); // new Array!// 尝试修改字符指针指向的字符串(不推荐,会导致未定义行为)// 下面这行代码会被注释掉,以避免编译器警告或运行时错误// pointerStr[0] = 'M'; // 这行代码会导致未定义行为printf("\n尝试修改字符指针指向的字符串(不推荐,会导致未定义行为)\n");// 重新赋值字符指针,使其指向新的字符串常量pointerStr = "new Pointer!";printf("重新赋值(指向其他字符串常量)后的字符指针: %s\n", pointerStr); // new Pointer!// 分别计算字符数组和字符指针所指向字符串的长度printf("\n--- 长度计算 ---\n");printf("字符数组 arrayStr 的字符串长度(不包括 '\\0'): %zu\n", strlen(arrayStr));printf("字符指针 pointerStr 所指向字符串的长度(不包括 '\\0'): %zu\n", strlen(pointerStr));return 0;
}

        程序在 VS Code 中的运行结果如下所示:

1.6 字符数组 VS 字符指针

字符数组的操作限制

        在 C 语言中,字符数组名是一个指向数组首元素的常量指针(constant pointer),这意味着:

  1. 初始化限制:
    • 只能在定义时初始化为一个字符串字面量或另一个字符数组的内容
    • 例如:char str[] = "Hello"; 或 char str[6] = {'H','e','l','l','o','\0'}; 或使用 strcpy 等函数初始化。
  2. 不可重新赋值:
    • 不能被重新赋值以指向新的内存地址
    • 错误示例:char str[10]; str = "New String";(会编译报错)。
    • 正确做法:只能通过逐个元素重新赋值使用 strcpy 等函数来修改内容。
#include <stdio.h>
#include <string.h>int main()
{// 定义并初始化字符数组char arrayStr[] = "Hello, Array!";printf("初始字符数组内容: %s\n", arrayStr);// 尝试将字符数组名指向新的字符串(会报错)// arrayStr = "New String!"; // 编译错误:数组名是常量指针,不能重新赋值// 使用 strcpy 修改字符数组内容//注意:目标数组必须足够大,以容纳源字符串strcpy(arrayStr, "new Array!");printf("使用 strcpy 修改后的内容: %s\n", arrayStr);// 逐个字符修改字符数组内容arrayStr[0] = 'N';arrayStr[1] = 'e';arrayStr[2] = 'w';arrayStr[3] = '_';arrayStr[4] = 'A';arrayStr[5] = 'r';arrayStr[6] = 'r';arrayStr[7] = 'a';arrayStr[8] = 'y';arrayStr[9] = '\0'; // 手动添加字符串结束符printf("逐个字符修改后的内容: %s\n", arrayStr);return 0;
}

        程序在 VS Code 中的运行结果如下所示:

字符指针的灵活性

        字符指针与字符数组名的一个关键区别在于其灵活性:字符指针是一个可变的指针,可以重新赋值以指向不同的字符串或内存位置

  1. 可重新赋值:
    • 字符指针可以在程序运行时指向不同的内存地址
    • 示例:char *ptr = "Hello"; ptr = "World";(合法)
  2. 动态性:
    • 可以指向字符串字面量、字符数组或动态分配的内存
    • 允许在运行时改变指向的内容
    • 不能通过指针修改字符串字面量的内容
#include <stdio.h>int main()
{// 1. 指向字符串字面量const char *ptr = "Hello, World!";printf("初始指向: %s\n", ptr);// 2. 重新赋值,指向另一个字符串字面量ptr = "This is a new string.";printf("重新赋值后指向: %s\n", ptr);// 3. 指向字符数组char arrayStr[] = "Character Array";ptr = arrayStr;printf("现在指向字符数组: %s\n", ptr);// 4. 修改字符数组内容(注意:不是修改指针本身)arrayStr[0] = 'L';printf("修改字符数组后的内容: %s\n", ptr); // 指针内容同步更新return 0;
}

        程序在 VS Code 中的运行结果如下所示:

修改方式的区别

        在C语言中,字符数组和字符指针虽然都可以用于处理字符串,但它们在修改方式上有本质区别:

特性字符数组字符指针
地址变化固定不变可以改变
修改内容修改数组内容,不改变数组地址改变指针值使其指向不同地址
内存分配通常为栈内存或静态存储区可以指向栈、静态存储区或堆内存
灵活性较低较高
  1. 字符数组:
    • 数组名是常量指针,初始化后地址固定
    • 只能修改数组内容,不能改变数组本身的地址
    • 示例:char str[10] = "Hello"; 后,str 始终指向同一内存位置。
  2. 字符指针:
    • 是一个变量,可以重新赋值指向不同地址
    • 可以指向字符串字面量、其他数组或动态分配的内存
    • 示例:char *ptr = "Hello"; ptr = "World"; 合法
#include <stdio.h>
#include <string.h>int main()
{// 定义字符数组和字符指针char arrayStr[] = "Hello, I am Init Array!";char *ptrStr = "Hello, Pointer!";// 输出初始地址和内容printf("【初始状态】\n");printf("字符数组 arrayStr 的地址: %p, 内容: %s\n", (void *)arrayStr, arrayStr);printf("字符指针 ptrStr 的地址: %p, 内容: %s\n\n", (void *)&ptrStr, ptrStr);// 修改字符数组内容(不改变地址)strcpy(arrayStr, "Modified Array");printf("【修改字符数组内容后】\n");printf("字符数组 arrayStr 的地址: %p, 内容: %s\n", (void *)arrayStr, arrayStr);printf("字符指针 ptrStr 的地址: %p, 内容: %s\n\n", (void *)&ptrStr, ptrStr);// 修改字符指针的指向(改变地址)ptrStr = "New Pointer String";printf("【修改字符指针的指向后】\n");printf("字符数组 arrayStr 的地址: %p, 内容: %s\n", (void *)arrayStr, arrayStr);printf("字符指针 ptrStr 的地址: %p, 内容: %s\n", (void *)&ptrStr, ptrStr);return 0;
}

        程序在 VS Code 中的运行结果如下所示:

对比总结表

特性/行为字符数组 (Character Array)字符指针 (Character Pointer)
定义方式char array[] = "Hello"; 或
char array[10];
char *ptr = "Hello"; 或
const char *ptr = "Hello";(推荐)
内存分配在栈上或静态存储区分配空间(可写)指向字符串字面量(只读)、字符数组(可写)或堆内存(需手动管理)
地址特性数组名是常量指针,指向固定不变指针变量本身是变量,可以改变其指向的地址
初始化只能在定义时用字符串字面量或字符列表或 strcpy 等函数初始化可在定义时赋值,也可后续重新赋值
内容修改可以修改数组中的字符(如 array[i] = 'a')如果指向的是字符数组或动态内存,可以修改内容;❌ 不可修改字符串字面量的内容
重新赋值❌ 不允许(如 array = "new"; 是非法操作)✅ 允许(如 ptr = "new"; 是合法操作)
字符串字面量指向✅ 可以初始化为字符串字面量✅ 可以指向字符串字面量
是否可变内容✅ 可变(因为数据在栈上或静态区,且是副本)

❌ 如果指向字符串字面量不可变;

✅ 如果指向字符数组或堆内存则可变

动态内存支持❌ 不支持(大小固定)✅ 支持,可通过 malloc / calloc 分配,并配合 realloc 动态扩展
灵活性❌ 固定大小和地址✅ 更灵活,可随时改变指向和大小
安全性⚠️ 易发生缓冲区溢出(如使用 strcpy 时未检查长度)⚠️ 需注意悬空指针、野指针、内存泄漏等
典型用途存储需要频繁修改的局部字符串字符串访问、函数传参、动态字符串处理等
内存释放❌ 不需要(栈内存自动释放)✅ 需要(当指向堆内存时,应调用 free())
字符串结束符 \0 的处理初始化时自动添加,手动修改时需注意维护同样需要保证以 \0 结尾才能作为字符串使用

2 编程练习

2.1 指针遍历数组

        编写程序,定义一个整型数组,并通过以下四种方式访问并打印数组中的每个元素:

  1. 通过数组名和下标访问:arr[i]
  2. 通过指针和下标访问:ptr[i]
  3. 通过数组名加偏移量访问:*(arr + i)
  4. 通过指针加偏移量访问:*(ptr + i)
#include <stdio.h>int main()
{// 定义一个整型数组并初始化int arr[] = {10, 20, 30};// 计算数组元素个数int size = sizeof(arr) / sizeof(arr[0]);// 定义指针指向数组首元素int *ptr = arr;// 使用四种方式访问数组元素并输出printf("数组元素为:\n");for (int i = 0; i < size; i++){printf("通过数组名下标访问: arr[%d] = %d\n", i, arr[i]);printf("通过指针下标访问:   ptr[%d] = %d\n", i, ptr[i]);printf("通过数组名偏移访问: *(arr + %d) = %d\n", i, *(arr + i));printf("通过指针偏移访问:   *(ptr + %d) = %d\n", i, *(ptr + i));printf("\n");}return 0;
}

        程序在 VS Code 中的运行结果如下所示:

2.2 指针与数组求和

        编写一个程序,定义一个整型数组,并使用指针以四种不同方式计算数组中所有元素的总和,并输出每种方式的结果。

  • 使用数组下标访问:arr[i]
  • 使用指针下标访问:ptr[i]
  • 使用数组名加偏移访问:*(arr + i)
  • 使用指针加偏移访问:*(ptr + i)
#include <stdio.h>int main()
{// 定义整型数组并初始化int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]); // 计算数组长度// 用于存储四种方式计算出的总和int sum[] = {0, 0, 0, 0};int *ptr = arr; // 指针指向数组首元素// 使用指针遍历数组,并用四种方法分别求和for (int i = 0; i < size; i++){// 方法一:使用数组名 + 下标访问sum[0] += arr[i];// 方法二:使用指针 + 下标访问sum[1] += ptr[i];// 方法三:使用数组名 + 偏移访问sum[2] += *(arr + i);// 方法四:使用指针 + 偏移访问sum[3] += *(ptr + i);}// 输出每种方法计算出的数组元素总和printf("数组元素的和为:\n");printf("  方法一(arr[i]):       %d\n", sum[0]);printf("  方法二(ptr[i]):       %d\n", sum[1]);printf("  方法三(*(arr + i)):   %d\n", sum[2]);printf("  方法四(*(ptr + i)):   %d\n", sum[3]);return 0;
}

        程序在 VS Code 中的运行结果如下所示:

2.3 指针与数组的最大值

        编写程序,定义一个整型数组,并通过指针访问数组元素的方式,查找该数组中的最大值。

#include <stdio.h>int main()
{int arr[] = {3, 7, 2, 9, 1};int size = sizeof(arr) / sizeof(arr[0]);int max = arr[0]; // 假设第一个元素是最大值int *ptr = arr;   // 指针指向数组的第一个元素// 使用指针查找数组中的最大值for (int i = 1; i < size; i++){// 1. 使用数组下标访问数组元素并比较// if (arr[i] > max)// {//     max = arr[i];// }// 2. 使用指针访问数组元素并比较if (*(ptr + i) > max){max = *(ptr + i);}}printf("数组中的最大值: %d\n", max);return 0;
}

        程序在 VS Code 中的运行结果如下所示:

2.4 指针与字符串反转

        编写程序,定义一个字符串,并使用两个字符指针分别指向字符串的开头和结尾,逐个交换字符,最终实现字符串的反转。

#include <stdio.h>
#include <string.h>int main()
{// 定义一个字符数组并初始化为待反转的字符串char str[] = "Hello, World!";// 获取字符串长度int length = strlen(str);// 定义两个指针:分别指向字符串的开头和末尾char *start = str;            // 指向字符串首字符char *end = str + length - 1; // 指向字符串最后一个有效字符// 使用指针对字符串进行原地反转while (start < end){// 交换当前 start 和 end 所指向的字符char temp = *start;*start = *end;*end = temp;// 移动指针:start 向后,end 向前start++;end--;}// 输出反转后的字符串printf("反转后的字符串: %s\n", str);return 0;
}

        程序在 VS Code 中的运行结果如下所示:

2.5 统计多个字符串长度

        定义一个指针数组,其元素指向多个字符串字面量。使用循环遍历该指针数组,统计并打印每个字符串的长度。要求不使用 strlen(),而是用指针手动遍历直到 '\0'。

#include <stdio.h>int main()
{char *words[] = {"apple", "banana", "cherry", "date"};int size = sizeof(words) / sizeof(words[0]);for (int i = 0; i < size; i++){int length = 0;       // 每一个单词的长度char *ptr = words[i]; // 指向每一个单词的指针// 计算单词的长度// *ptr 指向当前字符,当 *ptr 不为 '\0' 时,继续循环while (*ptr != '\0'){length++;ptr++;}printf("%s -> %d\n", words[i], length);}return 0;
}

        程序在 VS Code 中的运行结果如下所示:

2.6 查找最长的字符串

        给定一个指针数组,保存多个字符串地址。编写程序找出其中最长的字符串,并打印它的内容和长度。

#include <stdio.h>
#include <string.h>int main()
{char *names[] = {"Tom", "Jerry", "Alice", "Bob"};int size = sizeof(names) / sizeof(names[0]);char *longest = names[0]; // 假设第一个字符串是最长的for (int i = 1; i < size; i++){// 比较当前字符串和最长字符串的长度if (strlen(names[i]) > strlen(longest)){longest = names[i];}}printf("最长的字符串是:%s(长度为%d)\n", longest, (int)strlen(longest));return 0;
}

        程序在 VS Code 中的运行结果如下所示:

2.7 交换二维数组的两行

        定义一个 3x4 的二维数组,并使用数组指针交换其中任意两行的数据。例如交换第 0 行和第 2 行。要求通过指针操作完成,不要逐个交换元素。

#include <stdio.h>int main()
{int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};// 定义一个指向一行(4 个整数)的指针int (*rowPtr)[4] = matrix; // rowPtr 指向 matrix 的第 0 行// 打印原始矩阵printf("原始矩阵:\n");for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++){printf("%d ", rowPtr[i][j]);}printf("\n");}// 交换第 0 行和第 2 行int tempRow[4]; // 临时数组,用于保存第 0 行for (int j = 0; j < 4; j++){tempRow[j] = rowPtr[0][j];   // 保存第 0 行rowPtr[0][j] = rowPtr[2][j]; // 第 2 行赋给第 0 行rowPtr[2][j] = tempRow[j];   // 原第 0 行赋给第 2 行}// 打印交换后的矩阵printf("\n交换第0行和第2行后的矩阵:\n");for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++){printf("%d ", rowPtr[i][j]);}printf("\n");}return 0;
}

        程序在 VS Code 中的运行结果如下所示:

2.8 字符串字符类型统计(指针版)

        编写一个 C 程序,定义一个字符数组并初始化为一个字符串(如 "Hello World! 123"),然后使用字符指针遍历该字符串,并分别统计其中的:

  • 字母个数(A-Z, a-z)
  • 数字个数(0-9)
  • 其他字符个数(空格、标点等)
  • 最后输出各类字符的数量。

        要求:只能通过字符指针访问字符串内容,不能直接使用数组下标 [] 来访问字符。

#include <stdio.h>
#include <ctype.h> // 提供 isalpha() 和 isdigit()int main()
{// 定义并初始化字符数组char str[] = "Hello World! 123";// 定义字符指针,指向字符串首地址char *ptr = str;// 初始化计数器int letterCount = 0; // 字母计数int digitCount = 0;  // 数字计数int otherCount = 0;  // 其他字符计数// 使用字符指针遍历字符串while (*ptr != '\0'){if (isalpha(*ptr)){letterCount++; // 如果是字母,字母计数加一}else if (isdigit(*ptr)){digitCount++; // 如果是数字,数字计数加一}else{otherCount++; // 其他字符(如空格、标点)}ptr++; // 移动指针到下一个字符}// 输出结果printf("原始字符串: %s\n\n", str);printf("字母个数: %d\n", letterCount);printf("数字个数: %d\n", digitCount);printf("其他字符个数: %d\n", otherCount);return 0;
}

        程序在 VS Code 中的运行结果如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/83880.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/83880.shtml
英文地址,请注明出处:http://en.pswp.cn/web/83880.shtml

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

相关文章

gird 网格布局学习

属性 1、grid-template-columns 用来定义 网格容器的列轨道&#xff08;columns&#xff09; 的尺寸和数量。它允许你设定网格的列布局&#xff0c;控制列的宽度和排列方式。 // 使用示例 // 你可以使用固定的长度单位来定义每一列的宽度。例如 1、grid-template-columns: 100…

git最常用命令

本地身份 git config --global user.name "酒剑仙" git config --global user.email "xxxxqq.com"创建.gitignore文件 git init链接服务器 git remote add origin https://gitee.com/greentran/你的项目.git提交本地 git add .查看本地提交 git statu…

值类:Kotlin中的零成本抽象

Kotlin的值类&#xff08;Value Class&#xff09;是一种强大的类型安全工具&#xff0c;允许开发者创建语义明确的类型&#xff0c;并保持运行时零成本。 假设系统中存在用户的概念&#xff0c;用户拥有名字和电子邮箱地址。用户名和电子邮箱地址都是长度不超过120个字符的字…

arm64版BC-liunx-for-euler与X86_64版OpenEuler从源码安装git-lfs

1.arm64版BC-liunx-for-euler安装git-lfs 检查系统版本信息 uname -a Linux bms-42068966-004 5.10.0-136.49.0.127.10.oe2203.bclinux.aarch64 #1 SMP Tue Oct 10 14:09:09 CST 2023 aarch64 aarch64 aarch64 GNU/Linux 下载git-lfs构建脚本和源码 git clone https://gite…

2025国家卫健委减肥食谱PDF完整版(免费下载打印)

《成人肥胖食养指南&#xff08;2024年版&#xff09;》发布&#xff1a;科学减肥&#xff0c;从这里开始‌ 在这个追求健康与美的时代&#xff0c;减肥成为了许多人关注的热点话题。国家卫健委正式发布了《成人肥胖食养指南&#xff08;2024年版&#xff09;》&#xff0c;为我…

Android 手机如何实现本地视频音频提取?实战教程来了

我们经常会遇到这样的需求&#xff1a;比如看到一段喜欢的短视频&#xff0c;想把里面的背景音乐保存下来&#xff1b;或者需要从一段课程视频中提取语音内容用于学习。这时候&#xff0c;将手机视频转换成 MP3 音频就是一个非常实用的功能。 今天就来教大家如何使用一款简单好…

STM32项目---汽车氛围灯

一、蓝牙模块驱动 1、怎么使用蓝牙模块呢&#xff1f; 1&#xff1a;首先&#xff0c;先通过串口调试助手验证蓝牙模块是否正常使用。先连接好 2&#xff1a;打开串口调试软件配置好 3&#xff1a;发送测试指令&#xff1a;AT\r\n,返回OK&#xff0c;则说明连接正确&#xff…

python+uniapp微信小程序的共享雨伞租赁系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

一次生产故障引发的JVM垃圾回收器选型思考:彻底掌握垃圾回收原理及通用配置!

写在前面的话 前几天凌晨2点&#xff0c;我被一通电话惊醒——线上交易系统出现了严重的延迟问题&#xff0c;用户支付请求响应时间从平时的100ms飙升到了5秒&#xff0c;客服电话都被打爆了。 经过紧急排查&#xff0c;我们发现罪魁祸首竟然是JVM的垃圾回收器&#xff01;当…

学习日记-day30-6.15

完成目标&#xff1a; 知识点&#xff1a; 1.DDL和DML的补充 知识点 核心内容 重点 快速创建表 使用CREATE TABLE...AS SELECT语句基于现有表快速创建新表 结构和数据复制 vs 仅复制结构&#xff08;WHERE 12&#xff09; 数据删除操作 DELETE FROM逐条删除 vs TRUNCAT…

从检测到智能质控:IACheck如何成为TIC机构的AI中台?

一、TIC行业为何亟需AI质控&#xff1f; 过去十年&#xff0c;中国的TIC&#xff08;Testing, Inspection, Certification&#xff09;行业年均增长超过10%。无论是消费品、环境监测&#xff0c;还是工业制造、出口贸易&#xff0c;对“第三方检测报告”的依赖程度持续加深。 …

cka-1.32考题

1、HPA自动扩缩容 考题 &#xff08;考试的考题内容&#xff0c;只有下面方框里的内容&#xff09; 你必须连接到正确的主机。不这样做可能导致零分。 [candidatebase] $ ssh cka000050 Task 在 autoscale namespace 中创建一个名为 apache-server 的新 HorizontalPodAut…

DeepSeek 技术原理详解

引言 DeepSeek是一种基于Transformer架构的大型语言模型&#xff0c;它在自然语言处理领域展现出了卓越的性能。本文将深入探讨DeepSeek的技术原理&#xff0c;包括其架构设计、训练方法和优化策略&#xff0c;并结合代码实现进行详细讲解。 Transformer基础架构 DeepSeek基…

组件化 websocket

实时数据响应&#xff0c;组件化websocket减少代码冗余 组件定义 websocket.vue <template><div></div> </template><script>export default {data() {return {webSocket: null, // webSocket实例lockReconnect: false, // 重连锁&#xff0c;…

IBMS集成系统3D可视化数字孪生管理平台介绍、搭建、运维

IBMS集成系统3D可视化数字孪生管理平台介绍、搭建、运维 IBMS集成系统3D可视化数字孪生管理平台是一种先进的智能建筑管理系统&#xff0c;通过数字孪生技术和3D可视化界面&#xff0c;实现对建筑设施的全方位、智能化管理。该平台整合了物联网(IoT)、大数据、人工智能和三维建…

湖北理元理律师事务所:债务重组中的技术赋能与法律边界

一、当法律遇上算法&#xff1a;还款模型的进化 传统债务协商依赖律师经验&#xff0c;如今通过技术工具可实现&#xff1a; 输入&#xff1a;用户收入/债务/必需支出 输出&#xff1a; 1. 法定可减免金额&#xff08;基于LPR与历史判例库&#xff09;&#xff1b; 2.…

对抗串扰的第一武器

痕量分离;长度平行度;stackup&#xff1a;有没有一个脱颖而出&#xff1f; 我已经有一段时间没有看到关于串扰的文章了&#xff0c;所以我决定借此机会为那些可能对为什么精通串扰的 PCB 设计人员和硬件工程师使用各种设计规则来控制串扰感兴趣的 PCB 设计社区中的人简要介绍一…

FastAPI:(11)SQL数据库

FastAPI&#xff1a;(11)SQL数据库 由于CSDN无法展示「渐构」的「#d&#xff0c;#e&#xff0c;#t&#xff0c;#c&#xff0c;#v&#xff0c;#a」标签&#xff0c;推荐访问我个人网站进行阅读&#xff1a;Hkini 「渐构展示」如下&#xff1a; #c 概述 文章内容概括 #mermaid…

“智眸·家联“项目开发(一)

嵌入式开发调试知识点总结&#xff08;含操作流程&#xff09; 我们今天解决问题的过程&#xff0c;就像是侦探破案&#xff0c;从最表面的线索&#xff08;网络不通&#xff09;开始&#xff0c;一步步深入&#xff0c;最终找到了案件的核心&#xff08;硬件不匹配&#xff0…

展开说说Android之Retrofit详解_使用篇

Retrofit是由Square公司开发的类型安全HTTP客户端框架&#xff0c;借助动态代理在运行时生成接口实现类&#xff0c;将注解转化为OkHttp请求配置&#xff1b;节省成本通过转换器(Gson/Moshi)自动序列化JSON/XML&#xff0c;内部处理网络请求在主线程返回报文。Retrofit 直译是封…