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

指针简介

指针(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.xdnf.cn/news/1551608.html

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

相关文章

C++快速入门

文章目录 C快速入门一、命名空间1.初始C2.概念3.命名空间的定义1.普通的命名空间2.命名空间的嵌套3.命名空间的重名问题3.命名空间的展开 二、C的输入&输出三、缺省参数1.全缺省参数2.半缺省参数3.缺省参数的用途4.缺省参数的注意点 四、函数重载1.函数重载的原则2.以下的函…

【RocketMQ】RocketMQ应用难点

&#x1f3af; 导读&#xff1a;本文探讨了RocketMQ中消息重复消费的问题及其解决方案&#xff0c;尤其是在CLUSTERING模式下的扩容影响。文章分析了重复消费的原因&#xff0c;如广播模式、负载均衡模式下的多consumerGroup消费、消费者组内的动态变化及网络延迟等&#xff0c…

婚恋交友系统该如何做才能做到日进斗金?

要使婚恋交友系统实现盈利并做到日进斗金&#xff0c;需要综合考虑市场需求、用户体验、商业模式和营销策略等多个方面。以下是一些建议&#xff0c;旨在帮助构建一个成功且盈利的婚恋交友系统&#xff1a; 深入了解目标市场&#xff1a; 研究目标用户群体的需求、偏好和行为模…

这 5 个自动化运维场景,可能用 Python 更香?

许多运维工程师会使用 Python 脚本来自动化运维任务。Python 是一种流行的编程语言&#xff0c;具有丰富的第三方库和强大的自动化能力&#xff0c;适用于许多不同的领域。 这里插播一条粉丝福利&#xff0c;如果你正在学习Python或者有计划学习Python&#xff0c;想要突破自我…

10款好用的开源 HarmonyOS 工具库

大家好&#xff0c;我是 V 哥&#xff0c;今天给大家分享10款好用的 HarmonyOS的工具库&#xff0c;在开发鸿蒙应用时可以用下&#xff0c;好用的工具可以简化代码&#xff0c;让你写出优雅的应用来。废话不多说&#xff0c;马上开整。 1. efTool efTool是一个功能丰富且易用…

YOLO11震撼发布!

非常高兴地向大家介绍 Ultralytics YOLO系列的新模型&#xff1a; YOLO11&#xff01; YOLO11 在以往 YOLO 模型基础上带来了一系列强大的功能和优化&#xff0c;使其速度更快、更准确、用途更广泛。主要改进包括 增强了特征提取功能&#xff0c;从而可以更精确地捕捉细节以更…

编程魔法:基于LLM的AI function开发,如何实现高效数据生成?

基于大语言模型&#xff08;LLM&#xff09;的AI function开发&#xff0c;简直就是现代编程界的“魔法棒”&#xff01; 你好&#xff0c;我是三桥君 最近三桥君有个任务&#xff0c;需要造一些测试数据&#xff0c;比如姓名、手机号、银行卡号、邮箱啥的&#xff0c;用来做测…

PV大题--专题突破

写在前面&#xff1a; PV大题考查使用伪代码控制进程之间的同步互斥关系&#xff0c;它需要我们一定的代码分析能力&#xff0c;算法设计能力&#xff0c;有时候会给你一段伪代码让你补全使用信号量控制的操作&#xff0c;请一定不要相信某些人告诉你只要背一个什么模板&#…

新手必知的录屏工具及其使用方法详解

你平常会录屏吗&#xff1f;录屏已经成为了一项非常实用的技能。无论是制作教学视频还是记录游戏精彩瞬间&#xff0c;录屏都可以帮我们记录我们在电脑上看到的精彩瞬间。今天我们就一同来探索在电脑上如何录屏吧。 1.福昕录屏工具 链接&#xff1a;www.foxitsoftware.cn/REC…

太速科技-FMCJ457-基于JESD204B的2路2Gsps AD 2路2Gsps DA FMC子卡

FMCJ457-基于JESD204B的2路2Gsps AD 2路2Gsps DA FMC子卡 一、板卡概述 该子卡是高速AD9172 DAC和AD9689 ADC的FMC板。为客户提供高达2 GHz 的可用模拟带宽以及 JESD204B 接口&#xff0c;以快速地对各种宽带 RF 应用进行原型制作。 AD芯片AD9689&#xff0c;AD9689-2…

Ceph RocksDB 深度调优

介绍 调优 Ceph 可能是一项艰巨的挑战。在 Ceph、RocksDB 和 Linux 内核之间&#xff0c;实际上有数以千计的选项可以进行调整以提高存储性能和效率。由于涉及的复杂性&#xff0c;比较优的配置通常分散在博客文章或邮件列表中&#xff0c;但是往往都没有说明这些设置的实际作…

论文翻译 | LLaMA-Adapter :具有零初始化注意的语言模型的有效微调

摘要 我们提出了一种轻量级的自适应方法&#xff0c;可以有效地将LLaMA微调为指令遵循模型。lama - adapter采用52K自指导演示&#xff0c;在冻结的LLaMA 7B模型上只引入1.2M可学习参数&#xff0c;在8个A100 gpu上进行微调花费不到一个小时。具体来说&#xff0c;我们采用了一…

armbian安装docker

最近又搞了台瑞莎Radxa 3E &#xff0c;从零开始部署unbuntu环境&#xff0c;发现是真曲折啊&#xff0c;虽然有点前车之鉴了 在Armbian上安装Docker&#xff0c;可以按照以下步骤操作&#xff1a; 1、更新软件包列表&#xff1a; sudo apt-get update 2、安装必要的软件包…

【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧

文章目录 C模板进阶编程前言第一章: 非类型模板参数1.1 什么是非类型模板参数&#xff1f;1.1.1 非类型模板参数的定义 1.2 非类型模板参数的注意事项1.3 非类型模板参数的使用场景示例&#xff1a;静态数组的实现 第二章: 模板的特化2.1 什么是模板特化&#xff1f;2.1.1 模板…

安防监控/智慧安防EasyCVR视频汇聚监控平台无法启动并报错“no space left on service”是什么原因?

视频汇聚/安防监控/智慧安防EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。平台可以引入AI智能分析能力&#xff0c;能够实现对视频中的特…

DRF实操——支付宝的介绍与对接支付宝

DRF实操——支付宝的介绍与对接支付宝 1. 支付宝的介绍实际上线环境&#xff1a;开发环境&#xff1a; 2. DRF对接支付宝1. 创建配置文件2. 在setting文件中&#xff0c;做支付宝配置3. 安装支付宝第三方库4. 在setting文件中实例化支付宝对象5.创建模型&#xff0c;保存订单的…

【以图搜图代码实现2】--faiss工具实现犬类以图搜图

第一篇&#xff1a;【以图搜图代码实现】–犬类以图搜图示例 使用保存成h5文件&#xff0c;使用向量积来度量相似性&#xff0c;实现了以图搜图&#xff0c;说明了可以优化的点。 第二篇&#xff1a;【使用resnet18训练自己的数据集】 准对模型问题进行了优化&#xff0c;取得了…

【完-网络安全】Windows用户

文章目录 内置账号用户组通过命令行管理用户 内置账号 通过注销切换用户账号 Administrator用户 该帐号为系统默认的管理员帐号&#xff0c;该帐户具有Windows的最高管理权限&#xff0c;默认禁用。 Guest用户&#xff0c;来宾账户 可运行部分抵权限程序&#xff0c;查看部分文…

【STM32单片机_(HAL库)】4-0【定时器TIM】定时器中断配置步骤

定时器工作原理 定时器计数模式 定时器溢出时间计算 定时器中断实验配置步骤 msp 函数是对 MCU 相关的硬件进行初始化设置&#xff0c;通常被设计用于处理特定硬件外设或功能的底层初始化工作。

redis的数据结构,内存处理,缓存问题

redisObject redis任意数据的key和value都会被封装为一个RedisObject&#xff0c;也叫redis对象&#xff1a; 这就redis的头信息&#xff0c;占有16个字节 redis中有两个热门数据结构 1.SkipList&#xff0c;跳表&#xff0c;首先是链表&#xff0c;和普通链表有以下差异&am…