当前位置: 首页 > news >正文

C语言指针与数组的区别

在C语言中,指针和数组虽然在很多情况下可以互换使用,但它们在概念上和行为上存在一些区别。下面详细解释这些区别:

### 数组

1. **固定大小**:数组在声明时必须指定大小,这个大小在编译时确定,之后不能改变。
2. **连续内存**:数组中的元素在内存中是连续存储的。
3. **类型**:数组名代表数组首元素的地址,但数组名本身不是指针,它不能被赋值或重新赋值。
4. **操作**:数组可以通过索引直接访问元素,例如`arr[i]`。
5. **数组名作为参数**:当数组作为函数参数传递时,它退化为指向其首元素的指针。

### 指针

1. **动态大小**:指针可以指向任何类型的数据,其大小在运行时确定。
2. **内存位置**:指针存储的是它所指向的数据的内存地址。
3. **类型**:指针可以指向任何类型的数据,包括数组、函数等。
4. **操作**:指针可以通过解引用操作符`*`来访问或修改它所指向的数据,例如`*ptr`。
5. **指针算术**:指针可以进行算术运算,如递增(`ptr++`)或递减(`ptr--`),以及与其他指针进行加减运算。

### 区别

- **声明方式**:数组声明时使用方括号`[]`,而指针声明时使用星号`*`。
- **内存分配**:数组的内存分配在声明时就确定了,而指针的内存分配在运行时通过`malloc`或`calloc`等函数动态分配。
- **访问方式**:数组通过索引访问元素,而指针通过解引用访问数据。
- **参数传递**:数组传递给函数时,实际上传递的是指向数组首元素的指针,而指针作为参数传递时,传递的是指针本身的值。

### 示例

```c
int arr[5] = {1, 2, 3, 4, 5}; // 数组声明
int *ptr = arr; // 指针指向数组首元素

// 通过索引访问数组元素
printf("%d\n", arr[2]); // 输出:3

// 通过指针访问数组元素
printf("%d\n", *(ptr + 2)); // 输出:3
```

在上述示例中,`arr`是一个数组,而`ptr`是一个指针,指向数组`arr`的首元素。尽管它们在某些上下文中可以互换使用,但它们在概念上和行为上是不同的。理解这些区别对于编写高效和正确的C语言程序至关重要。

http://www.lryc.cn/news/368384.html

相关文章:

  • springboot3一些听课笔记
  • 【小沐学Python】Python实现Web服务器(CentOS下打包Flask)
  • Cesium开发环境搭建(一)
  • 视频、图片、音频资源抓取(支持视频号),免安装,可批量,双端可用!
  • FreeRTOS实时系统 在任务中增加数组等相关操作 导致单片机起不来或者挂掉
  • CentOS 7基础操作08_Linux查找目录和文件
  • CI/CD实战面试宝典:从构建到高可用性的全面解析
  • NLP实战入门——文本分类任务(TextRNN,TextCNN,TextRNN_Att,TextRCNN,FastText,DPCNN,BERT,ERNIE)
  • MySQL: 表的增删改查(基础)
  • WDF驱动开发-PNP和电源管理(三)
  • Redis集群和高可用性:保障Redis服务的稳定性
  • C# WPF入门学习主线篇(二十一)—— 静态资源和动态资源
  • 出现 Navicat 和 Cmd 下SQL 版本 | 查询不一致的解决方法
  • 31、matlab卷积运算:卷积运算、二维卷积、N维卷积
  • C++青少年简明教程:文件
  • Kimichat使用案例010:快速识别出图片中的表格保存到Excel
  • [大师C语言(第二十四篇)]C语言指针探秘
  • Docker命令总结
  • 把chatgpt当实习生,进行matlab gui程序编程
  • LabVIEW 与组态软件在自动化系统中的应用比较与选择
  • html--万年历
  • 2013年 阿拉斯加巴罗活动层厚度和土壤含水量
  • 超详解——python数字和运算——小白篇
  • LabVIEW图像采集处理项目中相机选择与应用
  • Java——IO流(一)-(2/9):File类的常用方法(判断文件类型、获取文件信息、创建删除文件、遍历文件夹)
  • 电子设计入门教程硬件篇之集成电路IC(二)
  • Unity3D测量面积和角度实现方法(二)
  • vite 配置 typescript 环境
  • ThreadCache线程缓存
  • UE5_加载本地图片(jpg, png) 转 UTexture