C语言基础(十三)

news2024/9/24 23:29:06

指针的用法:

测试代码1:

#include "date.h" 
#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    int time = getTime();
    int n = 3, m = 4;  
    
    // 使用malloc函数动态分配n行的指针数组,并将其赋值给二级指针arr。 
    int **arr = (int **)malloc(n * sizeof(int *));  
    // 循环遍历每一行。
    for (int i = 0; i < n; i++) {  
        // 为每一行动态分配m个整型元素的空间。
        arr[i] = (int *)malloc(m * sizeof(int));  
        // 循环遍历每一列。
        for (int j = 0; j < m; j++) {  
            //  填充二维数组的值
            arr[i][j] = i * m + j + 1; 
        }  
    }  
  
    // 使用指针遍历动态分配的二维数组  
    int *ptr;  
    for (int i = 0; i < n; i++) {  
        for (int j = 0; j < m; j++) {  
            // 将二维数组arr中每个元素的地址赋值给指针ptr。 
            ptr = &arr[i][j];  
            // 打印指针ptr指向的地址和值。
            printf("Address: %p, Value: %d\n", (void *)ptr, *ptr);  
        }  
    }  

    // 释放动态分配的内存空间
    for (int i = 0; i < n; i++) {
         free(arr[i]);  // 释放每一行的内存空间
    }
         free(arr);  // 释放指针数组的内存空间
         
         return 0;  
}

运行结果如下:

 

测试代码2:

#include "date.h" 
#include <stdio.h>  
  
// 函数声明  
void modifyChar(char *ptr);  
void modifyInt(int *ptr);  
void modifyFloat(float *ptr);  
  
int main() {  
    int time = getTime();
    char ch = 'A';  
    int num = 10;  
    float value = 3.14f;  
  
    // 调用 modifyChar 函数  
    printf("Before calling modifyChar: %c\n", ch);  
    modifyChar(&ch);  
    printf("After calling modifyChar: %c\n", ch);  
  
    // 调用 modifyInt 函数  
    printf("Before calling modifyInt: %d\n", num);  
    modifyInt(&num);  
    printf("After calling modifyInt: %d\n", num);  
  
    // 调用 modifyFloat 函数  
    printf("Before calling modifyFloat: %.2f\n", value);  
    modifyFloat(&value);  
    printf("After calling modifyFloat: %.2f\n", value);  
  
    return 0;  
}  
  
// 函数定义  
void modifyChar(char *ptr) {  
    *ptr = 'B';  
}  
  
void modifyInt(int *ptr) {  
    *ptr = 20;  
}  
  
void modifyFloat(float *ptr) {  
    *ptr = 2.71f;  
}

运行结果如下:

 

测试代码3:

#include "date.h" 
#include <stdio.h>  
#include <stdlib.h> // 引入stdlib.h以使用malloc和free  
#include <string.h> // 引入string.h以使用strlen和strcpy  
  
// 函数声明:返回指向动态分配字符串的指针  
char* createDynamicString(const char* input) {  
    // 计算输入字符串的长度(包括结尾的'\0')  
    size_t length = strlen(input) + 1;  
  
    // 使用malloc动态分配足够的内存存储字符串  
    char *str = (char*)malloc(length * sizeof(char));  
    if (str == NULL) {  
        // 如果malloc失败,返回NULL  
        return NULL;  
    }  
  
    // 使用strcpy将输入字符串复制到新分配的内存中  
    strcpy(str, input);  
  
    // 返回指向新字符串的指针  
    return str;  
}  
  
int main() {  
    int time = getTime();
    // 调用函数,传入一个字符串  
    char *myString = createDynamicString("Hello, Dynamic World!");  
  
    // 检查返回值是否为NULL,以处理malloc失败的情况  
    if (myString != NULL) {  
        // 如果分配成功,则打印字符串  
        printf("The dynamic string is: %s\n", myString);  
  
        // 使用完毕后,释放分配的内存  
        free(myString);  
    } else {  
        // 如果malloc失败,则打印错误消息  
        printf("Memory allocation failed!\n");  
    }  
  
    return 0;  
}

运行结果如下:

 

测试代码4:

#include "date.h" 
#include <stdio.h>  
#include <stdlib.h> // 引入stdlib.h以使用malloc  
  
// 函数声明,返回指向int的指针  
int* createIntPointer() {  
    // 动态分配一个整数的内存  
    int *ptr = (int*)malloc(sizeof(int));  
    if (ptr != NULL) {  
        *ptr = 10; // 初始化分配的内存  
    }  
    return ptr; // 返回指向整数的指针  
}  
  
int main() { 
    int time = getTime(); 
    // 调用函数,接收返回的指针  
    int *myInt = createIntPointer();  
  
    if (myInt != NULL) {  
        // 通过指针访问并打印整数的值  
        printf("The value is: %d\n", *myInt);  
  
        // 释放之前分配的内存  
        free(myInt);  
    }  
  
    return 0;  
}

运行结果如下:

 

测试代码5:

#include "date.h" 
#include <stdio.h>  
  
int addFive(int x) {  
    return x + 5;  
}  
int main() { 
    int time = getTime(); 
    int (*funcPtr)(int); // 定义指向函数的指针  
    funcPtr = addFive; // 将函数的地址赋给指针  
  
    // 通过指针调用函数  
    int result = funcPtr(10);  
    printf("The result is: %d\n", result); // 输出: The result is: 15  
  
    return 0;  
}

运行结果如下:

 

测试代码6:

#include "date.h" 
#include <stdio.h>  
  
// 定义两个函数  
int add(int a, int b) {  
    return a + b;  
}  
  
int multiply(int a, int b) {  
    return a * b;  
}  
  
int main() {  
    int time = getTime();
    // 定义指向函数的指针  
    int (*addPtr)(int, int) = add;  
    int (*multiplyPtr)(int, int) = multiply;  
  
    // 通过指针调用函数  
    printf("5 + 3 = %d\n", addPtr(5, 3));  
    printf("5 * 3 = %d\n", multiplyPtr(5, 3));  
  
    // 定义一个指向函数的指针数组  
    int (*funcPtrs[2])(int, int);  
    funcPtrs[0] = add;  
    funcPtrs[1] = multiply;  
  
    // 通过指针数组调用函数  
    printf("Using array to call functions:\n");  
    printf("funcPtrs[0](7, 2) = %d (addition)\n", funcPtrs[0](7, 2));  
    printf("funcPtrs[1](7, 2) = %d (multiplication)\n", funcPtrs[1](7, 2));  
  
    // 循环遍历数组中的函数  
    for (int i = 0; i < 2; i++) {  
        if (i == 0) {  
            printf("Calling addition: ");  
        } else {  
            printf("Calling multiplication: ");  
        }  
        printf("%d(%d, %d) = %d\n", i, 7, 4, funcPtrs[i](7, 4));  
    }  
  
    return 0;  
}

运行结果如下:

 

 

 

 

 

 

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

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

相关文章

链表的插入操作——CSP-J1真题详解

【题目】 假设有一个链表的节点定义如下: struct Node { int data; Node* next; }; 现在有一个指向链表头部的指针&#xff1a;Node* head。如果想要在链表中插入一个新的节点&#xff0c;其成员 data 的值为 42&#xff0c;并使新节点成为链表的第一个节点&#xff0c;下面…

LLM和VLM算法常见面试题

LLM相关问题&#xff1a; Bert和GPT的区别 Bert和GPT是两种不同类型的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;具有一些重要的区别。 模型架构&#xff1a;Bert是基于Transformer架构的模型&#xff0c;它是一个预训练的双向编码器。GPT也是基于Transformer…

【最大的和】

题目 思路 最大序列和的一般做法 dp前缀最大值 dp尾缀最大值 枚举分界点 代码 #include <bits/stdc.h> using namespace std;const int N 5e410; int a[N]; int um[N], dm[N], s; int main() {int t;cin >> t;um[0] INT_MIN;while(t--){int n;cin >> …

【Linux操作系统】进程间通信(1)

目录 一、认识进程间通信二、匿名管道三、命名管道 一、认识进程间通信 进程间不能直接传递数据&#xff0c;因为进程具有独立性&#xff0c;直接传递会破坏进程的独立性。 进程间通信是什么&#xff1f; 一个进程把自己的数据交给另一个进程。 为什么要有进程间通信&#xf…

ThreadLocal解惑

目录 1、ThreadLocal是什么? 2、ThreadLocal实现原理 3、设置线程变量的2种方式 4、关于ThreadLocal的内存泄漏问题 5、使用过程中的注意事项和误区 1、ThreadLocal是什么? 比较书面的回答&#xff1a; 类如其名&#xff0c;线程本地变量。当使用 ThreadLocal 维护变量时…

防爆巡检机器人:工业安全领域的璀璨明星

在当今快速发展的工业领域&#xff0c;安全与效率是企业追求的双核动力。特别是在石油、化工、钢铁冶金、燃气等高风险、高爆炸性的行业中&#xff0c;如何确保生产环境的绝对安全&#xff0c;同时提升巡检效率&#xff0c;成为了企业亟需解决的重大课题。正是在这样的背景下&a…

leetcode 438 找到字符串中所有字母异位词

leetcode 438 找到字符串中所有字母异位词 正文 正文 本题和 leetcode 49 字母异位分词 有些类似&#xff0c;只是 49 题中要求我们找出所有的异位词并进行存储&#xff0c;而本题我们只需要找出异位词对应的索引值。因此&#xff0c;我们无需用到字典&#xff0c;只需使用列表…

理解线程 ID 和 LWP

序言 在不同的系统中&#xff0c;为了更好地管理用户可能会采取不同的编号。比如在学校的教务系统中&#xff0c;管理学生使用的是学号&#xff1b;但是在住宿系统中&#xff0c;为了更加方便的获取一个学生的寝室信息&#xff0c;可能会采取结合你是哪一栋&#xff0c;哪一层&…

MindSearch 部署的到 Hugging Face Space

和原有的CPU版本相比区别是把internstudio换成了github codespace。 随着硅基流动提供了免费的 InternLM2.5-7B-Chat 服务&#xff08;免费的 InternLM2.5-7B-Chat 真的很香&#xff09;&#xff0c;MindSearch 的部署与使用也就迎来了纯 CPU 版本&#xff0c;进一步降低了部署…

【Windows】深度学习环境部署

引言 1 Windows环境准备 1.1 VSCode Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的开源代码编辑器。它非常受开发者欢迎&#xff0c;因为它功能强大、扩展性好&#xff0c;并且支持多种编程语言。VSCode 尤其适合 Python 开发&#xff0c;特别是…

WEB渗透免杀篇-Pezor免杀

往期文章 WEB渗透免杀篇-免杀工具全集-CSDN博客 WEB渗透免杀篇-加载器免杀-CSDN博客 WEB渗透免杀篇-分块免杀-CSDN博客 WEB渗透免杀篇-Powershell免杀-CSDN博客 WEB渗透免杀篇-Python源码免杀-CSDN博客 WEB渗透免杀篇-C#源码免杀-CSDN博客 WEB渗透免杀篇-MSFshellcode免杀…

文心一言 VS 讯飞星火 VS chatgpt (331)-- 算法导论22.5 7题

七、给定有向图 G ( V &#xff0c; E ) G(V&#xff0c;E) G(V&#xff0c;E)&#xff0c;如果对于所有结点对 u , v ∈ V u,v∈V u,v∈V,我们有 u → v u→v u→v或 v → u v→u v→u&#xff0c;则 G G G是半连通的。请给出一个有效的算法来判断图 G G G是否是半连通的。证…

根据需求、质量属性描述和架构特性开发一套公路桥梁在线管理系统

目录 案例 【题目】 【问题 1】(12 分) 【问题 2】(13 分) 答案 【问题 1】答案 【问题 2】答案 相关推荐 案例 阅读以下关于软件架构评估的叙述&#xff0c;在答题纸上回答问题 1 和问题 2。 【题目】 某单位为了建设健全的公路桥梁养护管理档案&#xff0c;拟开发一套公…

若依框架搭建

一、后端启动 1、git克隆下载前后端分离版本 RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 (gitee.com) 2、初始化项目 到springboot后如…

Excel中的“LOOKUP”:熟识四个LOOKUP,可以让数据“查找”得心应手

熟识四个lookup&#xff0c;可以让数据“查找”得心应手。 (笔记模板由python脚本于2024年08月23日 19:27:16创建&#xff0c;本篇笔记适合喜欢用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖…

入门 PyQt6 看过来(项目)29 在线购物-销售分析

销售分析部分包含按月分析的簇状图和按类别分析的饼图&#xff0c;如下&#xff1a; ​ 1 页面设计 设计该页面其实很简单&#xff0c;说白了就是两个也切tab类以及饼图和簇状图。打开QTDesiger&#xff0c;按下图添加控件&#xff0c;并重命名如下&#xff1a; ​ 2 按类…

计算机视觉与视觉大模型对板书检测效果对比

文章目录 计算机视觉火山引擎ocr阿里云ocr 视觉大模型GPT4kimi通义千问chatGLM百度 全部正确某开源模型&#xff0c;效果不佳 计算机视觉 火山引擎ocr 阿里云ocr 视觉大模型 GPT4 kimi 通义千问 chatGLM 百度 全部正确 某开源模型&#xff0c;效果不佳

基于springboot的养老院管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的养老院管理系统拥有多种角色账号&#xff1a;管理员和用户 管理员&#xff1a;管理员管理、用户管理、健康管理、病例方案管理、药品管理、餐饮管理、外出管理、入住管理…

汇编

汇编指令 随机数mov指令mov指令ldr指令&#xff08;伪指令&#xff09;add指令sub指令bic指令orr指令b指令cmp指令stmfd指令ldmfd指令import栈汇编指令的s后缀 随机数 1.如果某个数的数值范围是0~255之间&#xff0c;那么这个数一定是立即数&#xff1b; 2.把某个数展开成2进制…

树与图的宽度优先遍历

大致思想请参照添加链接描述该篇博客 主要地方的差异就是&#xff1a; 宽度优先遍历就是一层一层的搜索 图中数的层次题目 给定一个 n个点 m条边的有向图&#xff0c;图中可能存在重边和自环。 所有边的长度都是 1&#xff0c;点的编号为 1∼n。 请你求出 1号点到 n号点的…