c语言基础回顾-指针 | AI工程化部署

简介: 为什么要在这里回顾下C/C++的基础知识,无疑是因为它的高效性。

1.写在前面

为什么要在这里回顾下C/C++的基础知识,无疑是因为它的高效性。

C语言是一种高效、快速、通用的编程语言,起源于1972年,由贝尔实验室的Dennis Ritchie和Ken Thompson共同开发。最初,C语言的设计是为了开发Unix操作系统,它在计算机领域的发展中起到了至关重要的作用。

C语言的应用场景非常广泛,在操作系统开发(Linux、Unix),嵌入式开发,数据库开发(MySQL、SQLite),编译器和网络驱动程序,游戏开发(Unity游戏引擎等)以及应用程序开发等各方面都发挥的重要中。同时C语言在深度学习的各大框架pytorch,tensorflow,mxnet也扮演着举足轻重的作用。

同样,在AI工程化部署中也十分重要。

所以这里我们发一些章节快速的回顾下c、c++的重要概念和技术。

2. 指针

在C语言中,指针是一种非常重要的概念,它允许我们直接访问内存中的数据。下面是指针的基本使用方法:

指针:指针是一个变量,它存储的是另一个变量的内存地址。我们可以通过指针来访问和修改这个变量的值。

int num = 10;  // 定义一个整型变量
int *p;       // 定义一个指向整型变量的指针

p = #     // 将指针p指向变量num的地址

printf("%d\n", *p);  // 输出变量num的值,使用间接访问运算符*

指针索引:指针可以用来遍历数组,通过改变指针的值来访问数组中的元素。

int arr[] = {
   1, 2, 3, 4, 5};  // 定义一个整型数组
int *p = arr;                 // 将指针p指向数组的第一个元素

for (int i = 0; i < 5; i++) {
   
    printf("%d ", *(p + i));  // 输出数组元素的值,使用指针索引
}

指针数组:指针数组是一个数组,其中的每个元素都是一个指针。

int num1 = 10;
int num2 = 20;
int num3 = 30;

int *arr[] = {
   &num1, &num2, &num3};  // 定义一个指针数组,存储三个指针

for (int i = 0; i < 3; i++) {
   
    printf("%d ", *(*arr[i]));  // 输出指针指向的变量的值
}

和&符号的使用:在指针操作中,符号用来声明一个指针变量,或者用来访问指针指向的变量;&符号用来取得变量的地址。

int num = 10;     // 定义一个整型变量
int *p = &num;   // 将指针p指向变量num的地址

printf("%d\n", *p);  // 输出变量num的值

int *ptr;        // 声明一个指针变量

指针的指针:指针的指针是指一个指针变量存储了另一个指针变量的地址。

int num = 10;       // 定义一个整型变量
int *p = &num;     // 将指针p指向变量num的地址
int **pp = &p;     // 将指针pp指向指针p的地址

printf("%d\n", **pp);  // 输出变量num的值

这些是指针的基本使用方法和相关概念,通过这些例子,你可以更好地理解和掌握指针的用法。

指针的指针在某些特殊场景下非常有用,它可以用来实现多级间接访问和动态内存分配。下面是指针的指针的一些特别应用场景的例子:

函数参数传递:指针的指针可以用于通过函数参数来修改原始指针的值。

void changeValue(int **pp) {
   
    int *p = *pp;  // 获取指针pp指向的指针
    *p = 20;       // 修改指针p指向的变量的值
}

int main() {
   
    int num = 10;
    int *p = &num;
    changeValue(&p);
    printf("%d\n", *p);  // 输出20,原始指针的值被修改
    return 0;
}

动态内存分配:指针的指针可以用于动态分配多维数组或指针数组。

int main() {
   
    int rows = 3;
    int cols = 4;
    int **matrix = (int **)malloc(rows * sizeof(int *));  // 分配二维指针数组的内存空间

    for (int i = 0; i < rows; i++) {
   
        matrix[i] = (int *)malloc(cols * sizeof(int));  // 分配每一行的内存空间
    }

    // 使用指针的指针访问和修改数组元素
    for (int i = 0; i < rows; i++) {
   
        for (int j = 0; j < cols; j++) {
   
            matrix[i][j] = i + j;
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 释放内存空间
    for (int i = 0; i < rows; i++) {
   
        free(matrix[i]);
    }
    free(matrix);

    return 0;
}

字符串数组的排序:指针的指针可以用于对字符串数组进行排序。

#include <stdio.h>
#include <string.h>

void sortStrings(char **strArr, int length) {
   
    for (int i = 0; i < length - 1; i++) {
   
        for (int j = i + 1; j < length; j++) {
   
            if (strcmp(strArr[i], strArr[j]) > 0) {
   
                char *temp = strArr[i];
                strArr[i] = strArr[j];
                strArr[j] = temp;
            }
        }
    }
}

int main() {
   
    char *names[] = {
   "John", "Alice", "Bob", "David", "Cindy"};
    int length = sizeof(names) / sizeof(names[0]);

    sortStrings(names, length);

    for (int i = 0; i < length; i++) {
   
        printf("%s\n", names[i]);
    }

    return 0;
}

这些是指针的指针的一些特别应用场景的例子。通过使用指针的指针,我们可以实现更灵活和高效的编程。

目录
相关文章
|
1月前
|
人工智能 Java Serverless
阿里云函数计算助力AI大模型快速部署
随着人工智能技术的快速发展,AI大模型已经成为企业数字化转型的重要工具。然而,对于许多业务人员、开发者以及企业来说,探索和利用AI大模型仍然面临诸多挑战。业务人员可能缺乏编程技能,难以快速上手AI模型;开发者可能受限于GPU资源,无法高效构建和部署AI应用;企业则希望简化技术门槛,以更低的成本和更高的效率利用AI大模型。
137 12
|
6天前
|
人工智能 物联网
如何将Together AI上基于Qwen2-7B训练的模型部署到ModelScope平台
如何将Together AI上基于Qwen2-7B训练的模型部署到ModelScope平台
41 10
|
6天前
|
存储 人工智能 Serverless
7分钟玩转 AI 应用,函数计算一键部署 AI 生图大模型
人工智能生成图像(AI 生图)的领域中,Stable Diffusion WebUI 以其强大的算法和稳定的输出质量而闻名。它能够快速地从文本描述中生成高质量的图像,为用户提供了一个直观且高效的创作平台。而 ComfyUI 则以其用户友好的界面和高度定制化的选项所受到欢迎。ComfyUI 的灵活性和直观性使得即使是没有技术背景的用户也能轻松上手。本次技术解决方案通过函数计算一键部署热门 AI 生图大模型,凭借其按量付费、卓越弹性、快速交付能力的特点,完美实现低成本,免运维。
|
20天前
|
人工智能 数据库连接 API
在部署《主动式智能导购 AI 助手构建》解决方案的过程中,整体体验还是相对顺畅的,但确实遇到了一些问题,文档提供的引导也有所不足,以下是详细的体验评估
在部署《主动式智能导购 AI 助手构建》解决方案的过程中,整体体验还是相对顺畅的,但确实遇到了一些问题,文档提供的引导也有所不足,以下是详细的体验评估
|
1月前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
26天前
|
人工智能 API Windows
免费部署本地AI大语言模型聊天系统:Chatbox AI + 马斯克grok2.0大模型(简单5步实现,免费且比GPT4.0更好用)
本文介绍了如何部署本地AI大语言模型聊天系统,使用Chatbox AI客户端应用和Grok-beta大模型。通过获取API密钥、下载并安装Chatbox AI、配置模型,最终实现高效、智能的聊天体验。Grok 2大模型由马斯克X-AI发布,支持超长文本上下文理解,免费且易于使用。
100 0
|
4天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
39 23
|
4天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
26 15
|
4天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
40 24