C语言指针的使用

news2024/11/26 16:48:11

文章目录

  • 前言
  • 一、指针基本概念介绍
  • 二、指针的大小
  • 三、使用指针访问变量和变量地址
  • 四、使用指针遍历数组
  • 总结


前言

一、指针基本概念介绍

在 C 语言中,指针是一种用于存储内存地址的数据类型。指针可以存储任何数据类型的内存地址,包括基本数据类型、数组、结构体、函数等。通过指针,可以实现对内存中某个位置的直接访问和修改,这是 C 语言中很多高级特性的实现基础。

在定义指针变量时,需要指定指针变量所指向的数据类型。语法格式如下:

type *ptr;

其中 type 是指针变量所指向的数据类型,* 表示这是一个指针类型的变量,ptr 是指针变量的名称。例如,以下代码定义了一个指向整型数据的指针变量:

int *p;

指针变量在初始化之前,通常会被赋予 NULL 或者 0 这样的无效地址。指针变量可以通过取地址符 & 来获取某个变量的内存地址。例如,以下代码获取了整型变量 num 的内存地址,并将其赋给指针变量 p:

int num = 10;
int *p = # // p 中保存 num 的内存地址

二、指针的大小

在C语言中,指针的大小与它所指向的数据类型有关。由于不同类型所占据的空间大小是不同的,指向不同类型的指针也会有不同的大小。

在32位的系统中,指针的大小通常是4个字节,即32位;在64位的系统中,指针的大小通常是8个字节,即64位。但是,这仅仅是指针变量本身所占据的空间大小,指针所指向的实际数据类型的大小并不一定相同。

例如,以下代码分别定义了指向不同类型数据的指针:

int *p_int;
char *p_char;
float *p_float;

在大多数编译器实现中,这些指针变量都占据 4 个字节(32位系统)或 8 个字节(64位系统)的空间。但是,这些指针所指向的实际数据类型占据的空间是不同的。int 类型通常占据 4 个字节,char 类型通常占据 1 个字节,float 类型通常占据 4 个字节。因此,在通过这些指针来访问内存中的数据时,每种类型需要根据它所占据的空间数来确定访问的字节数。

另外,需要注意的是函数指针的大小,函数指针与普通指针的大小并不相同。函数指针(指向函数的指针)的大小取决于系统的架构和指针实现的细节。

总的来说,指针的大小取决于系统的位数和指针所指向的数据类型。对于特定的系统和编译器,可以使用 sizeof 运算符来计算指针的大小。

在x86中指针大小运算结果:

在这里插入图片描述

在x64中指针大小运算结果:
在这里插入图片描述

三、使用指针访问变量和变量地址

在 C 语言中,使用指针可以访问变量的值和内存地址。

访问变量的值可以通过指针运算符 * 来实现。例如,以下代码定义了一个整型变量 num 和一个指向 num 的指针变量 p,并使用指针变量 p 访问 num 的值:

int num = 10;
int *p = # // p 中保存 num 的内存地址
int value = *p; // value 等于 num 的值,也就是 10

在这个例子中,使用取地址符 & 来获取 num 变量的内存地址,并将其赋给指针变量 p。然后,使用指针运算符 * 访问 p 指向的内存地址中存储的值,即 num 变量的值。

访问变量的内存地址可以直接使用取地址符 &。例如,以下代码访问 num 变量的内存地址,并将其打印出来:

int num = 10;
int *p = # // p 中保存 num 的内存地址
printf("%p", &num); // 打印 num 的内存地址

在这个例子中,printf 函数使用 %p 格式化字符串打印 num 变量的内存地址,使用取地址符 & 获取了 num 变量的内存地址。

四、使用指针遍历数组

指针可以用来遍历数组,可以直接通过指针来访问数组元素的值。

以下是一个使用指针遍历数组的示例代码:

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

for (int i = 0; i < 5; i++) {
    printf("%d ", *(p + i));
}

在这个示例中,数组 arr 包含了5个整型元素,定义了一个指针变量 p 指向数组的第一个元素。使用 for 循环遍历了数组中的所有元素,在每一次循环中,通过指针 p 加上偏移量 i 来访问数组的每一个元素的值,即 *(p + i)。

需要注意的是,在使用指针遍历数组时,指针的类型必须匹配数组元素的类型,否则会导致访问内存时出现错误。另外,指针变量 p 中并不存储数组的长度信息,因此在进行指针遍历时需要保证不越界。

也可以使用指针或者下标来访问数组元素的值。介绍一下使用 p[i] 的方式来遍历数组。

p[i] 和 *(p + i) 是等价的方式,都是通过指针偏移量来访问数组元素的值。例如,以下代码使用 p[i] 的方式遍历数组:

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

for (int i = 0; i < 5; i++) {
    printf("%d ", p[i]); // 使用 p[i] 的方式访问数组元素的值
}

在这个示例中,与使用指针和偏移量计算元素地址访问数组元素的方式不同,使用 p[i] 的方式直接使用下标 i 来访问数组中的元素。p[i] 实际上等价于 *(p + i)。

需要注意的是,在使用 p[i] 的方式遍历数组时,指针变量 p 必须指向数组的第一个元素。在函数参数中传递数组时,数组会退化为指向第一个元素的指针,因此也可以使用 p[i] 的方式来访问数组中的元素。

总结

本篇文章我们只是简单的了解了指针的基本概念和基本用法,后续我们还会讲解指针的高级用法,大家可以多多关注我将持续更新文章。

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

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

相关文章

C语言之单链表的实现以及链表的介绍

一、为什么会存在链表 因为我们常用的顺序表会存在以下的一些问题&#xff1a; 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长&#xff0c;势必会有一定…

算法的特性和空间复杂度---数据结构

目录 前言&#xff1a; 1.算法 1.1算法的特性 1.2设计算法 2.空间复杂度 3.学习复杂度的意义 ❤博主CSDN&#xff1a;啊苏要学习 ▶专栏分类&#xff1a;数据结构◀ 学习数据结构是一件有趣的事情&#xff0c;希望读者能在我的博文切实感受到数据之间存在的关系&#xff…

【3dmax】常用的快捷键总结以及如何修改快捷键

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于建模的笔记 &#x1f236;本篇是3dmax常用的快捷键总结以及如何修改快捷键 3dmax常用的快捷键总结以及如何修改快捷键 3dmax常用快捷键如何添加或修改快捷键 3dmax常用快捷键 视…

go pprof性能调优工具

go pprof 一、性能调优原则二、pprof1、pprof 功能简介2、pprof 排查实战前置工作a、CPUb、Heapc、goroutined、mutexe、block 3、pprof 的采样过程和原理a、cpub、heapc、goroutine && threadCreated、block && mutex 三、调优流程1、业务优化a、流程 2、基础…

2023.4.17-4.23 AI行业周刊(第146期):创业要趁早

最近有很多外部拓展培训的需求&#xff0c;联盟的共学课程培训&#xff0c;公司视觉软件的培训&#xff0c;行业课程的培训&#xff0c;每一项培训听起来简单&#xff0c;但是其实都需要大量的时间精力。 前两年也准备过一份《30天入门人工智能》的视频课程&#xff0c;总共31…

Ansible自动化部署工具|各个模块的使用

Ansible自动化部署工具|各个模块的使用 一、自动化运维工具—Ansible二、安装Ansible查询webserver组中主机的日期 三 Ansible常用模块(1) ansible命令行模块(2) command模块(3) shell模块(4) cron模块(5) user模块(6) grup模块(7) copy模块(8) file模块(9) ping模块(10) servi…

内网穿透NPS和宝塔Nginx配合使用,开启SSL访问本地局域网网络

并非为了教学&#xff0c;仅供自己记录&#xff0c;方便下次用。所以内容不会刻意花时间写的很细节详细。 1. 服务器NPS配置 NPS install安装后&#xff0c;配置文件会在其他位置&#xff0c;通过是 /etc/nps/nps.conf目录。 找到进行修改&#xff0c;主要修改的是http_proxy_p…

【flask】三种路由和各自的比较配置文件所有的字母必须大写if __name__的作用核心对象循环引用的几种解决方式--难Flask的经典错误

三种路由 方法1&#xff1a;装饰器 python C#, java 都可以用这种方式 from flask import Flask app Flask(__name__)app.route(/hello) def hello():return Hello world!app.run(debugTrue)方法2: 注册路由 php python from flask import Flask app Flask(__name__)//app…

【以太坊 Solidity】管理员读写权限/访问控制/角色控制

摘要 在 Solidity 语言的多继承中&#xff0c;若多个合约共同继承一个父合约&#xff0c;则这多个合约 共享 父合约中的变量和函数。 1.测试的智能合约 合约继承路线如下&#xff1a; #mermaid-svg-DtimeTjOch5CJh50 {font-family:"trebuchet ms",verdana,arial,s…

应用,auto,内联函数

6.引用&#xff1a; //指针 int main() {int a 0;int& b a;int& c b;int& d c;cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;b;d;cout << a <<…

WEB攻防通用漏洞跨域CORS资源JSONP回调域名接管劫持

目录 一、同源策略&#xff08;SOC&#xff09; 二、跨域资源&#xff08;COSP&#xff09; 三、回调跨域&#xff08;JSOP&#xff09; 四、CORS资源跨域-敏感页面原码获取 五、JSONP 回调跨域-某牙个人信息泄露 六、子域名劫持接管 一、同源策略&#xff08;SOC&#x…

C#手麻系统源码, 基于前端Winform+后端WCF +sqlserver 开发

手麻系统源码&#xff0c;自动生成电子单据 基于C# 前端框架&#xff1a;Winform后端框架&#xff1a;WCF 数据库&#xff1a;sqlserver 开发的手术室麻醉临床信息系统源码&#xff0c;应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人…

Buffer Pool介绍

Buffer Pool基本概念 Buffer Pool&#xff1a;缓冲池&#xff0c;简称BP。其作用是用来缓存表数据与索引数据&#xff0c;减少磁盘IO操作&#xff0c;提升效率 Buffer Pool由 缓存数据页(Page) 和 对缓存数据页进行描述的控制块 组成, 控制块中存储着对应缓存页的所属的 表空…

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三 主题整体听一遍精听句子 1扩展 way of doing | way to do sth 句子 2扩展 Expression扩展 base 句子 3句子 4扩展 red-hot 句子 5句子 6扩展 fiery 句子 7句子 8句子 9句子 10句子 11扩展 born 句子 12句子 13句子…

Haar特征和级联分类器目标检测介绍及应用

文章目录 Haar特征和级联分类器目标检测介绍及应用1. Haar特征2. 级联分类器3. 实现步骤4.尝试训练自己的级联分类器4. 应用示例 Haar特征和级联分类器目标检测介绍及应用 Haar特征和级联分类器是一种经典的目标检测算法&#xff0c;适用于检测物体在图像中的位置、大小和姿态…

卷积神经网络算法解读

神经网络算法解读 机器学习流程&#xff1a; 数据获取特征工程建立模型评估与应用 图像数据是一个矩阵300 * 100 * 3 线性函数分类方法&#xff1a;分类&#xff08;wxb线性回归&#xff09; 损失函数&#xff1a;预测值与实际值之间的差异值 softmax分类器&#xff1a; 神…

(Python)Jupyter Notebook无法运行代码,且提示error和自动保存失败时如何操作?无法链接内核?

目录 一、报错情形 1、运行代码时跳转下一行&#xff0c;无法执行代码。 2、在修改文件名是提示失败&#xff0c;出现“error”字样。 二、深层原因 三、解决方案 四.建议使用原环境 Anaconda的Jupyter Notebook作为优秀的网页编辑器&#xff0c;非常适用于编写Python程序…

ubuntu16.04升级到20.04后报错 By not providing “FindEigen.cmake“

编译问题&#xff1a; CMake Error at modules/perception/lidar/CMakeLists.txt:14 (find_package): By not providing "FindEigen.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Eigen&…

黑马Redis入门到实战(基础篇)

Redis基础篇 Redis的类型和常见命令以及客户端使用 目录 1 .初识Redis 1 .1 .认识NoSQL 1 .1 .1 .结构化与非结构化 1 .1 .2 .关联和非关联 1 .1 .3 .查询方式 1 .1 .4 .事务 1 .1 .5 .总结 1 .2 .认识Redis 1 .3 .安装Redis 1 .3 .1 .依赖库 1 .3 .2 .上传安装包并解压 1 .3 .…

音视频八股文(8)-- h264 AnnexB三层结构

NALU(Network Abstract Layer Unit) ⾳视频编码在流媒体和⽹络领域占有重要地位&#xff1b;流媒体编解码流程⼤致如下图所示&#xff1a; H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准⾥称为H.264&#xff0c…