C语言指针详解与应用(不断更新)

news2024/12/25 14:17:59

指针简介

指针(Pointer)是C语言的一个重要知识点,其使用灵活、功能强大,是C语言的灵魂

指针与底层硬件联系紧密,使用指针可操作数据的地址,实现数据的间接访问

指针生活实例化

指针的本质是地址,在生活中比如你取快递时的快递单号,所发的位置地址,比如中国北京清华大学,这个就是地址,在生活中int(c语言的基本类型),就好比装water的容器,int a=0;可以这么理解有一个int类型的水杯,它的名字叫a,里面存放0这个水,但是我们如果想让舍友帮忙拿一下水杯,我们可以怎么说“哥们帮我拿一下我的水杯,在咱们宿舍里,我的桌子上”,其中“我的水杯(水杯类型的指针),在咱们宿舍里,我的桌子上”这个就是目前我的水杯的地址==(int *p=&a),这就是指针的实例化

计算机存储机制

int a = 0x12345678;

short b = 0x5A6B;

char c[ ] = {0x33, 0x34, 0x35};

指针

定义指针

指针即指针变量,用于存放其他数据单元(变量/数组/结构体/函数等)的首地址。若指针存放了某个数据单元的首地址,则这个指针指向了这个数据单元,若指针存放的值是0,则这个指针为空指针 定义一个指针变量:

 在定义指针时,它分配的字节大小是由计算机本身决定的,32位操作系统分配四个字节,64位操作系统分配8个字节

指针的操作

若已定义:  

 int a;        //定义一个int型的数据   

 int *p;      //定义一个指向int型数据的指针

q++理解:指向下一个(相邻的内存地址)char类型数据的地址,在内存中移动了sizeof(char)个位置

d++理解:指向下一个(相邻的内存地址)int类型数据的地址,在内存中移动了sizeof(int)个位置

其实可以等效理解为数组q++指向下一个存储单元

数组与指针

数组是一些相同数据类型的变量组成的集合,其数组名即为指向该数据类型的指针。数组的定义等效于申请内存、定义指针和初始化

例如:     char c[ ] = {0x33, 0x34, 0x35};

等效于:  申请内存         

                定义 char *c = 0x4000;

                初始化数组数据

利用下标引用数组数据也等效于指针取内容。

例如:    c[0];    等效于:    *c;

               c[1];    等效于:    *(c+1);

               c[2];    等效于:    *(c+2);

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    //第6页示例代码
    int *e;
    e=(int*)malloc(3*4);
    printf("(int*)malloc(3*4)= %x\n", (int*)malloc(3*4));//把分配到的首地址给e
    *e=10;
    *(e+1)=20;
    *(e+2)=30;
    printf("%d\n", *e);
    printf("%d\n", *(e+1));
    printf("%d\n", *(e+2));
    free(e);
    
    int n[]={1,2,3};
    printf("n[0]= %d\n", n[0]);
    printf("n[1]= %d\n", n[1]);
    printf("n[2]= %d\n", n[2]);

    printf("*n= %d\n", *n);
    printf("*(n+1)= %d\n", *(n+1));
    printf("*(n+2)= %d\n", *(n+2));
    
    char str[] = "Hello, World!";
    printf("%s\n", str);
    printf(str);
    return 0;
}

malloc:属于  #include <stdlib.h> 中的方法分配一个3*4这么大的内存空间,同时把它强转为int*类型,在使用完malloc之后要使用free();释放空间

数组的底层就是指针的操作,数组名e就是数组的地址,也是数组的第一元素的首地址

字符串的底层是数组

在底层,实际存储的时候,c语言还是会帮我们把字符串"abc"转换成字符数组进行保存,并且在未尾还要再加上"\0"

注意事项

在对指针取内容之前,一定要确保指针指在了合法的位置,否则将会导致程序出现不可预知的错误 同级指针之间才能相互赋值,跨级赋值将会导致编译器报错或警告

指针的应用

传递参数

使用指针传递大容量的参数,主函数和子函数使用的是同一套数据,避免了参数传递过程中的数据复制,提高了运行效率,减少了内存占用

使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回,可实现多返回值函数的设计

#include <stdio.h>

// 函数:计算和与差
void calculate(int a, int b, int *sum, int *difference) {
    *sum = a + b;            // 计算和
    *difference = a - b;     // 计算差
}

int main() {
    int x = 10;
    int y = 5;
    int result_sum;        // 存放和
    int result_diff;       // 存放差

    // 调用函数
    calculate(x, y, &result_sum, &result_diff);

    // 输出结果
    printf("Sum: %d\n", result_sum);
    printf("Difference: %d\n", result_diff);

    return 0;
}

传递返回值

将模块内的公有部分返回,让主函数持有模块的“句柄”,便于程序对指定对象的操作

#include <stdio.h>
#include <stdlib.h>

// 定义一个结构体作为句柄
typedef struct {
    int *data;      // 动态数组指针
    int size;       // 数组大小
} ArrayHandle;

// 模块函数:创建动态数组
ArrayHandle createArray(int size) {
    ArrayHandle handle;
    handle.data = (int *)malloc(size * sizeof(int));
    handle.size = size;

    // 初始化数组
    for (int i = 0; i < size; i++) {
        handle.data[i] = i + 1; // 示例初始化
    }

    return handle; // 返回句柄
}

// 模块函数:释放动态数组
void freeArray(ArrayHandle *handle) {
    if (handle->data != NULL) {
        free(handle->data);
        handle->data = NULL; // 避免悬空指针
    }
}

// 模块函数:打印数组
void printArray(ArrayHandle handle) {
    for (int i = 0; i < handle.size; i++) {
        printf("%d ", handle.data[i]);
    }
    printf("\n");
}

int main() {
    // 创建动态数组句柄
    ArrayHandle myArray = createArray(5);

    // 打印数组内容
    printArray(myArray);

    // 释放动态数组
    freeArray(&myArray);

    return 0;
}

直接访问物理地址下的数据

访问硬件指定内存下的数据,如设备ID号等

将复杂格式的数据转换为字节,方便通信与存储

关于CLion的安装可以参考CLion安装、配置、使用、调试(完全小白向)-CSDN博客。

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

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

相关文章

当年掏空身体的9款怀旧软件,满满回忆杀

有个网站掀起了一股怀旧软件的风潮&#xff0c;让人惊喜地发现&#xff0c;尽管许多软件已不再更新&#xff0c;但时至今日&#xff0c;部分软件依然能够正常运行。 想当年&#xff0c;电脑价格贵的很&#xff0c;一但有机会接触电脑&#xff0c;那就是全神贯注&#xff0c;以…

仕考网:国考省考考试内容区别

国考和省考备考内容有一定的相似之处&#xff0c;具体考哪些内容你了解多少?中仕为大家分享一下吧! 题量&#xff1a; ①国考&#xff1a;行测一般有130-135道题目; ②省考&#xff1a;题量大多在120道左右&#xff0c;胳臂省份不同; 常识判断&#xff1a; ①国考&#x…

latex打出邮箱图标和可点击的orcidID

如图所示&#xff1a; 邮箱的打法 \usepackage{bbding} \inst{(}\Envelope\inst{)}orcidID的打法 \newcommand{\myorcidID}[1]{\href{https://orcid.org/#1}{\includegraphics[width8pt]{res/orcid.png}}} \captionsetup[algorithm]{skip5pt} \definecolor{customblue}{RGB}{…

使用 Colly 在 Golang 中进行网页抓取的步骤

什么是 Colly&#xff1f; Go 是一种用途广泛的语言&#xff0c;它拥有可以完成几乎所有工作的包和框架。 今天&#xff0c;我们将使用一个名为 Colly 的框架&#xff0c;它是一个用 Go 语言编写的、高效且强大的网页抓取框架&#xff0c;用于从网络上抓取数据。它提供了一个…

IPD的定义和三大重组

目前&#xff0c;业界对IPD的一般理解是&#xff1a;IPD——Integrated Product Development&#xff08;集成产品开发&#xff09;是一套领先的、成熟的产品开发的管理思想、模式和方法。它是根据大量成功的产品开发管理实践总结出来的&#xff0c;并被大量实践证明的高效的研…

Oracle 配置恢复目录catalog

一.介绍 Oracle中使用RMAN备份的数据我们分为两类 RMAN知识库数据库的数据块 Oracle默认把 RMAN知识库 放在目标数据库的控制文件中&#xff0c;在以后进行恢复的时候 我们要先读知识库的信息然后才能恢复。 但这样就产生了一个问题&#xff0c;知识库放在了控制文件上&#xf…

Whisper的使用

whisper的下载路径&#xff1a;https://github.com/openai/whisper需要安装以下的包。要求python的版本在3.9以上&#xff1a;如果当前python环境在3.9以下&#xff0c;可以换whisper的版本。点一下 releases 按钮。可以下载其他版本。使用whisper的时候需要其他包的安装。记住…

TypeScript 算法手册 - 【冒泡排序】

文章目录 TypeScript 算法手册 - 冒泡排序1. 冒泡排序简介1.1 冒泡排序定义1.2 冒泡排序特点 2. 冒泡排序步骤过程拆解2.1 比较相邻元素2.2 交换元素2.3 重复过程 3. 冒泡排序的优化3.1 提前退出3.2 记录最后交换位置案例代码和动态图 4. 冒泡排序的优点5. 冒泡排序的缺点总结 …

UEFI EDK2框架学习(三)——protocol

一、Protocol协议 搜索支持特定Protocol的设备&#xff0c;获取其Handle gBS->LocateHandleBuffer 将内存中的Driver绑定到给定的ControllerHandle gBS->OpenProtocol 二、代码实现 Protocol.c #include <Uefi.h> #include <Library/UefiLib.h> #includ…

cmd发邮件:Windows命令行发送邮件的教程!

cmd发邮件怎么通过命令行实现&#xff1f;如何使用CMD发送邮件&#xff1f; 通过cmd发邮件&#xff0c;你可以在不打开任何邮件客户端的情况下&#xff0c;直接从命令行发送邮件。AokSend将详细介绍如何使用cmd发邮件功能&#xff0c;让你轻松掌握这一实用技能。 cmd发邮件&a…

信息收集---WAF指纹识别

1. 什么是waf web应用防火墙&#xff0c;一款集网站内容安全防护、网站资源安全防护及流量保护功能为一体的服务器工具。为用户提供实时网站安全防护&#xff0c;避免各类针对网站的攻击带来的危害。&#xff08;核心其实也是基于规则的防御&#xff09;| 任何工具&#xff08…

解决 Could not locate zlibwapi.dll. Please make sure it is in your library path

zlibwapi.dll文件是zlib库的Windows版本&#xff0c;很多Python上的库想要在Windows上执行都需要依赖这个文件。 可以通过本人上传的免费资源直接下载&#xff1a;zlibwapi 链接&#xff1a;https://pan.baidu.com/s/1u8osbt_IevO4GOkXthZ04A 提取码&#xff1a;c2mf zlibwa…

8 时间序列相关工具介绍

1 背景 发现最近做的任务都是有关于时间序列任务的&#xff0c;做的方法全部偏向于如何对数据进行清洗、提取周期特征然后构造相关特征&#xff0c;这些工作都是比较偏向于传统时间序列模型的方案。 现在深度学习这个火&#xff0c;比如循环神经网络分支&#xff1a;L…

Typora 下载安装

准备工作 下载 下载链接&#xff1a;https://www.123865.com/ps/EF7OTd-adAnH 演示环境 操作系统&#xff1a;windows10 产品&#xff1a;typora 版本&#xff1a; 1.9.5 注意&#xff1a;如果需要其他版本可自行下载。 安装步骤 1、解压。 2、双击 "typora-setup-x64.…

基于SpringBoot+Vue的社区智慧消防管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

前端工程规范-3:CSS规范(Stylelint)

样式规范工具&#xff08;StyleLint&#xff09; Stylelint 是一个灵活且强大的工具&#xff0c;适用于保持 CSS 代码的质量和一致性。结合其他工具&#xff08;如 Prettier 和 ESLint&#xff09;&#xff0c;可以更全面地保障前端代码的整洁性和可维护性。 目录 样式规范工具…

国庆出行新伴侣:骨传导耳机分享,开启安全无忧的音乐旅行

随着国庆长假的脚步渐近&#xff0c;许多朋友已经开始规划自己的出游行程。无论是短途旅行还是长途跋涉&#xff0c;一款合适的耳机无疑是旅途中的良伴&#xff0c;特别是在户外活动频繁的假期&#xff0c;骨传导耳机因其独特的优点而成为了众多旅行者的首选。骨传导技术通过振…

心理咨询行业为何要有自己的知识付费小程序平台 心理咨询小程序搭建 集师saas知识付费小程序平台搭建

在快节奏的现代生活中&#xff0c;心理健康问题日益凸显&#xff0c;心理咨询行业迎来了前所未有的发展机遇。然而&#xff0c;传统咨询模式受限于地域、时间等因素&#xff0c;难以满足日益增长的多元化需求。在此背景下&#xff0c;搭建自己的知识付费小程序&#xff0c;成为…

python UNIT 3 选择与循环(2)

目录 1。循环的优化 经典优化分析&#xff1a; 未优化的代码&#xff1a; 细节分析&#xff1a; 优化后的代码&#xff1a; 优化的细节&#xff1a; 性能对比 优化的关键在于&#xff1a; 经典习题讲解&#xff1a;(紫色的解析请重点关注一下) 1。例三 个人代码解析…

Python发送邮件附件全攻略:从设置到发送!

Python发送邮件附件的详细步骤&#xff1f;如何利用Python发信&#xff1f; Python作为一种强大的编程语言&#xff0c;提供了丰富的库来帮助我们自动化这一过程。AokSend将详细介绍如何使用Python发送邮件附件&#xff0c;从基础设置到实际发送&#xff0c;带你一步步掌握这一…