首页 > 其他分享 >C语言指针与数组的区别

C语言指针与数组的区别

时间:2024-06-16 14:31:21浏览次数:14  
标签:arr 指向 元素 C语言 数组 ptr 指针

在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语言程序至关重要。

标签:arr,指向,元素,C语言,数组,ptr,指针
From: https://blog.csdn.net/onlyoneggp/article/details/139568419

相关文章

  • 华为OD机试C卷(100分)-字符串分割(二)(C语言)
    题目描述给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含有的大写字母比......
  • 华为OD机试C卷(100分)-连续字母长度(C语言)
    题目描述给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第k长的子串的长度,相同字母只取最长的那个子串。输入描述第一行有一个子串(1<长度<=100),只包含大写字母。第二行为k的值输出描述输出连续出现次数第k多的字母的次数。用例输入AAAAHHHBBCDHHH......
  • 图文+实战,轻松学会数据结构【数组】
    作者:周棋洛,大二计算机在校生......
  • 【Git入门和实战】第2课:git中的专有名词和概念解释:仓库、工作目录、暂存区、远程仓库
    本文是git入门到实战系列文章的第2课,主要讲解git中的专有名词和概念,主要有仓库(repository)、工作目录(WorkingDirectory)、暂存区(Stage/Index)、远程仓库(remote)、、提交(commit)、HEAD指针、文件状态、分支(branch)、合并(merge)、标签(tag)、引用(ref)。(文末附练习题,......
  • NumPy数组的创建
    NumPy数组的创建方法说明array()最常用的方法arange()创建元素值在某个范围的数组,可以指定步长linspace()创建元素值在某个范围的数组,可以指定个数zeros()创建元素值为0的数组ones()创建元素值为1的数组randint(start,end)随机整数,范围为[start,en......
  • C语言期末复习多选题50道(含答案)
    答案:1·BCD·2.ABC·3.A·4.AC·5.ABC·6.BCD·7.ACD·8.BD·9.BC·10.BCD·11.ABD·12.ABD·13.ABD·14.AB·15.BCD·16.BCD·17.CD·18.AB·19.BD·20.ABD·21.CD·22.ABD·23.CD·24.C·25.ABD......
  • linux下C语言如何操作文件(二)
    上篇文章中,我们简单介绍了file_util.h中定义的各函数,今天我们来讲解如何实现头文件中定义的各函数。首先,在file_util.c中,我们需要引入相应的头文件:#include<stdio.h>#include<stdlib.h>#include<stdbool.h>#include<unistd.h>#include<sys/stat.h>#include<sys/typ......
  • 【C++学习笔记 3】指针
    指针的本质指针实际上就是一个整数,存储着一个内存地址。不必执着于用“类型”的概念区分,那只是为了方便设计出来的,所有的指针,本质上都是一个整数,存储着一个内存的地址。#include<iostream>#defineLOG(x)std::cout<<x<<std::endlintmain(){ intvar=8; ......
  • 【C语言】assert.h——断言
    文章目录主要内容调试和发布模式使用示例用法总结与注意事项断言是一种用于在程序执行过程中进行调试的工具,能够帮助开发者验证程序的某些假设是否为真。如果断言失败,程序会终止,并输出一个错误消息,通常包含出错的文件名和行号。这对于调试和测试非常有帮助。主要......
  • C语言数据结构实现-双向链表
    前面学习了如何创建一个双向链表,本节学习有关双向链表的一些基本操作,即如何在双向链表中添加、删除、查找或更改数据元素。本节知识基于已熟练掌握双向链表创建过程的基础上,我们继续上节所创建的双向链表来学习本节内容,创建好的双向链表如图1所示:双向链表添加节点根据数据添......