C 语言指针与数组的深度解析

 

目录

​编辑

一、引言

二、指针的基本概念

1.定义与声明

2.指针的运算

3.指针的作用

三、数组的基本概念

1.定义与声明

2.数组的初始化

3.数组的大小

四、指针与数组的关系

1.数组名作为指针

2.指针与数组的相互转换

3.指针与数组的参数传递

五、指针与数组的高级用法 

1.指向数组的指针

2.数组指针作为函数参数 

六、总结


一、引言

        在 C 语言中,指针和数组是两个非常重要的概念,它们之间有着紧密的联系。理解指针和数组的工作原理以及它们之间的关系,对于编写高效、灵活的 C 语言程序至关重要。本文将深入探讨 C 语言指针和数组的特性、用法以及它们之间的相互作用。

二、指针的基本概念

1.定义与声明

  • 指针是一个变量,它存储了另一个变量的地址。在 C 语言中,可以使用指针类型来声明指针变量。例如,int *ptr;声明了一个指向整数类型的指针变量ptr
  • 指针变量可以通过取地址运算符&来获取其他变量的地址,并将其存储在指针变量中。例如,ptr = &var;将变量var的地址存储在指针变量ptr中。

2.指针的运算

  • 指针可以进行一些特定的运算,如加法、减法和比较。指针的加法和减法通常是按照指针所指向的数据类型的大小进行的。例如,如果指针指向整数类型,那么指针加一将指向下一个整数的地址。
  • 指针的比较可以用于判断两个指针是否指向同一个地址或者判断一个指针是否在另一个指针之前或之后。

3.指针的作用

指针在 C 语言中有很多重要的作用。它们可以用于动态内存分配,允许程序在运行时根据需要分配和释放内存。指针还可以用于函数参数传递,通过传递指针可以在函数内部修改外部变量的值。此外,指针还可以用于实现复杂的数据结构,如链表、树和图等。

三、数组的基本概念

1.定义与声明

  • 数组是一组相同类型的元素的集合,它们在内存中连续存储。在 C 语言中,可以使用数组类型来声明数组变量。例如,int arr[10];声明了一个包含 10 个整数元素的数组变量arr
  • 数组的下标从 0 开始,通过下标可以访问数组中的元素。例如,arr[0]表示数组arr的第一个元素。

2.数组的初始化

  • 数组可以在声明时进行初始化。可以使用花括号括起来的一组初始值来初始化数组。例如,int arr[5] = {1, 2, 3, 4, 5};初始化了一个包含 5 个整数元素的数组arr,其初始值分别为 1、2、3、4 和 5。
  • 如果只提供部分初始值,未初始化的元素将被自动初始化为 0。例如,int arr[5] = {1, 2};将数组arr的前两个元素初始化为 1 和 2,其余元素自动初始化为 0。

3.数组的大小

在 C 语言中,数组的大小是在编译时确定的。一旦数组被声明,其大小就不能改变。可以使用sizeof运算符来获取数组的大小,以字节为单位。例如,sizeof(arr)将返回数组arr的总大小,即数组元素个数乘以每个元素的大小。

四、指针与数组的关系

1.数组名作为指针

  • 在 C 语言中,数组名可以被视为指向数组第一个元素的指针。
  • 例如,对于数组int arr[10];arr可以被看作是一个指向整数类型的指针,它指向数组的第一个元素arr[0]
  • 可以使用指针运算来访问数组中的元素。例如,*(arr + i)表示访问数组arr的第i个元素,等价于arr[i]

2.指针与数组的相互转换

  • 可以将指针转换为数组类型,也可以将数组转换为指针类型。
  • 例如,int *ptr; int arr[10]; ptr = arr;将数组arr转换为指针类型,并将其赋值给指针变量ptr。反之,int (*ptr_arr)[10]; ptr_arr = &arr;将指针ptr_arr声明为指向包含 10 个整数元素的数组的指针,并将数组arr的地址赋值给它。

3.指针与数组的参数传递

  • 在函数参数传递中,数组名通常会被自动转换为指向数组第一个元素的指针。这意味着可以使用指针来接收数组参数,并在函数内部通过指针运算来访问数组中的元素。
  • 例如,以下函数接受一个整数数组作为参数,并计算数组中元素的总和:
int sum_array(int *arr, int size) {int sum = 0;for (int i = 0; i < size; i++) {sum += arr[i];}return sum;
}int main() {int arr[5] = {1, 2, 3, 4, 5};int sum = sum_array(arr, 5);return 0;
}

五、指针与数组的高级用法 

1.指向数组的指针

  • 可以声明指向数组的指针,这种指针可以指向不同大小的数组。例如,int (*ptr_arr)[3];声明了一个指向包含 3 个整数元素的数组的指针ptr_arr
  • 可以使用这种指针来访问不同大小的数组,或者动态分配数组的内存。例如,以下代码演示了如何使用指向数组的指针来动态分配一个二维数组的内存:
int **allocate_2d_array(int rows, int cols) {int **arr = (int **)malloc(rows * sizeof(int *));for (int i = 0; i < rows; i++) {arr[i] = (int *)malloc(cols * sizeof(int));}return arr;
}void free_2d_array(int **arr, int rows) {for (int i = 0; i < rows; i++) {free(arr[i]);}free(arr);
}int main() {int rows = 3;int cols = 4;int **arr = allocate_2d_array(rows, cols);// 使用二维数组for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {arr[i][j] = i * cols + j;}}// 释放二维数组的内存free_2d_array(arr, rows);return 0;
}

2.数组指针作为函数参数 

  • 可以将指向数组的指针作为函数参数,以传递数组的地址和大小信息。这种方式可以避免在函数参数传递中复制整个数组,提高函数的效率
  • 例如,以下函数接受一个指向整数数组的指针和数组的大小作为参数,并对数组中的元素进行排序:
void sort_array(int (*arr)[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = i + 1; j < size; j++) {if (arr[i] > arr[j]) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}
}int main() {int arr[5] = {3, 1, 4, 2, 5};sort_array(&arr, 5);return 0;
}

六、总结

        C 语言中的指针和数组是两个非常强大的概念,它们之间有着紧密的联系。理解指针和数组的工作原理以及它们之间的关系,可以帮助我们编写更加高效、灵活的 C 语言程序。在使用指针和数组时,需要注意内存管理和边界检查,以避免出现内存泄漏和数组越界等问题。同时,还可以结合其他 C 语言特性,如结构体、联合体和位域等,来实现更加复杂的数据结构和算法。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习(九)-图像形态操作

仿射变换 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够保持图像的平直性和平行性。平直性是指图像经过仿射变换后&#xff0c;直线仍然是直线&#xff1b;平行性是指图像在完成仿射变换后&#xff0c;平行线仍然是平行线。 平移 镜像 旋转…

[已更新问题二三matlab+python]2024数学建模国赛高教社杯C题:农作物的种植策略 思路代码文章助攻手把手保姆级

发布于9.6 10:00 有问题后续会修正!! 问题一代码展示: 问题二代码结果展示: 问题三代码展示: https://docs.qq.com/doc/DVVVlV0NmcnBDTlVJ问题一部分代码分享: #!/usr/bin/env python # coding: utf-8# In[15]:import pandas as pd# In[16]:# 读取Excel文件 file_path 附件2…

通义灵码助力高校开学第一课,“包”你满意,新学期加油!

通义灵码作为国内领先的 AI 编码工具&#xff0c;近年来在高校中得到了广泛应用和推广。它不仅帮助大学生更高效地学习编程、提高代码质量&#xff0c;还激发了他们的创新思维&#xff0c;并为未来的职业生涯做好了准备。 通义灵码是什么&#xff1f; 通义灵码是一款基于通义…

数据分析新星,DuckDB与Pandas处理大数据速度对比

大家好&#xff0c;Pandas库众所周知&#xff0c;适合数据分析新手入门&#xff0c;但在大数据面前却显得处理缓慢。相比之下&#xff0c;开源的DuckDB以其卓越的列式存储性能&#xff0c;在大数据处理上速度惊人&#xff0c;速度远超Pandas。而且&#xff0c;DuckDB配备了Pyth…

GPT-4o在加密货币情绪动态和行为模式应用

本文研究了加密货币相关讨论中的预测性陈述、希望言论和后悔检测行为&#xff0c;旨在通过少量学习和大语言模型&#xff08;如GPT-4o&#xff09;分析投资者的情绪动态和预测行为。该问题的研究难点包括&#xff1a;数据量有限、资源可用性不足、需要准确分类预测性陈述、希望…

企业精英引领未来,大数据讲座照亮中职学子职业航道

为深化校企合作模式&#xff0c;加速产教融合步伐&#xff0c;搭建起职业教育与职场世界的无缝对接桥梁&#xff0c;唯众企业携手武汉市第二职业教育中心&#xff08;简称“武汉二职”&#xff09;&#xff0c;共同举办了一场别开生面的专题讲座。此次活动不仅促进了企业与学生…

掌握SQLAlchemy:Python数据库的魔法师

文章目录 掌握SQLAlchemy&#xff1a;Python数据库的魔法师背景&#xff1a;为什么选择SQLAlchemy&#xff1f;SQLAlchemy是什么&#xff1f;如何安装SQLAlchemy&#xff1f;五个简单的库函数使用方法1. 创建引擎2. 定义模型3. 创建会话4. 添加数据5. 查询数据 场景应用1. 多表…

vulhub ThinkPHP5 5.0.23远程代码执行漏洞

1.执行以下命令启动靶场环境并在浏览器访问 cd thinkphp/5.0.23-rcedocker-compose up -ddocker ps 2.访问网页172.16.1.26:8080 3.判断是否存在漏洞&#xff1a;访问/index.php?scaptcha页面&#xff0c;会出现如下报错 4.使用HackBar 插件发送 POST 请求 _method__constru…

etcdctl defrag 剔除、添加etcd节点

零、准备工作 find / -name etcdctl cp /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/12/fs/usr/local/bin/etcdctl /usr/local/bin/etcdctlalias ec"etcdctl --endpointshttps://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --…

【杂记】裂脑人实验和语言模型幻觉

【杂记】裂脑人实验和语言模型幻觉 模型的自主意识在哪里&#xff0c;人的自我认知在哪里&#xff1f;自然而然的&#xff0c;“裂脑人” 这个词突然出现在我脑海里。然后随意翻了翻相关的文章&#xff0c;觉得这个问题和目前大模型面临的幻觉问题也高度相关&#xff0c;遂随笔…

macos下的 sed命令安装与使用 gnu-sed

sed命令是我们在linu类系统中非常重要的一个命令, 但是在macos下面默认是没有sed命令的, 不过我们可以通过brew install gnu-sed ( 或者通过 sudo port install gsed )这个软件包来获得这个命令 GNU sed 命令安装 下面2种方式,选择一种安装即可 # brew安装 brew install gn…

栈 | 队列

系统栈主要保存以下内容&#xff1a; 1.局部变量&#xff0c;2.函数的形参和返回值 3.函数的调用关系 一、栈 1.基本概念 栈是一种特殊的线性表&#xff0c;具有线性结构。表尾为栈顶&#xff0c;表头为栈顶。遵循先进后出原则&#xff0c;只能在栈顶进行插入和删除操作。 …

下载Mongodb 4.2.25 版本教程

1、MongoDB 安装包的下载链接 Download MongoDB Community Server | MongoDB 进入如下截图&#xff1a; 2、查找历史版本 往下拉&#xff0c;点击“...”,找到”Archived releases”,点击进入 、 3、下载Mongodb 4.2.25 版本 找到如下图4.2.25版本下载链接&#xff0c;点击就可…

Python输出多位数

作者制作不易&#xff0c;关注、点赞、收藏一下吧&#xff01; 1.第一种:正常直接用循环 以三位数为例: for i in range(100, 1000):print(i) 运行结果( 展示一部分 ): 图1-1 2.第二种:特定位数 以三位数为例: for i in range(1, 5): # 括号内指定那个位的范围for j in r…

【Java那些事】关于Git的使用

目录 下拉代码仓库篇 上传代码篇 下拉代码仓库篇 第一步&#xff0c;下拉代码&#xff0c;复制链接。 &#xff08;从开源网站上复制链接&#xff09; &#xff08;建立本地仓库&#xff09; 这里的URL一般都会自动填充刚刚复制的链接【瞅瞅&#xff0c;确保是想要的那个项…

oracle锁的机制

文章目录 oracle锁的机制1. 概括2.锁的模式3.锁查看 死锁1. 说明2.死锁产生条件3.解决死锁冲突4. 事务和死锁预防总结 oracle锁的机制 1. 概括 1&#xff09;说明 锁是一种机制&#xff0c;多个事务同时访问一个数据库对象时&#xff0c;该机制可以实现对并发的控制 2&…

Android Dialog:Dialog和DialogFragment的区别?DialogFragment如何使用?源码解析

目录 一、Dialog和DialogFragment的区别 Android在DialogFragment推出后&#xff0c;就已经不推荐继续使用Dialog&#xff0c;可替换为DialogFragment&#xff1a; 更好的生命周期管理&#xff1a;DialogFragment能够自动处理Activity的生命周期事件&#xff0c;确保对话框在…

Git 撤回commit

上一篇&#xff0c;Git撤销add&#xff0c;其实已经讲了用reset命令可以取消commit&#xff0c;这里再啰嗦下。先看&#xff1a; git如何撤回已经commit • Worktile社区 首先明确一点&#xff0c;无论是commit还是撤销commit&#xff0c;都是在本地暂存区操作&#xff0c;而…

如何测试一个算法

目录 1.从参数上进行设计 2.从代码逻辑上进行设计 3.从代码性能上进行设计 4.考虑异常情况 5.总结 下面是冒泡排序的代码&#xff0c;我们如何针对这个代价进行测试? public void BubbleSort(int[] arr) {for (int i 0; i < arr.length; i) {for (int j 0; j < a…

CleanMyMac X2024最新官方中文破解版本下载

&#x1f9f9; 嘿&#xff0c;Mac用户们&#xff0c;你们的小助手来了&#xff01; 今天要跟大家分享的&#xff0c;是一个能让你们的电脑焕发新生的神器——CleanMyMac X。这可不是一般的清洁工&#xff0c;它可是拥有超能力的超级英雄哦&#xff01;&#x1f31f; CleanMyMa…