百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

C语言指针与数组的区别

haoteby 2025-02-27 15:16 17 浏览

在C语言中,指针和数组是两个非常核心的概念,它们之间既有联系又有区别。以下是它们的详细对比:


1. 定义与本质

  • 数组
    • 数组是一段连续的内存空间,用于存储相同类型的多个元素。
    • 数组名是一个常量指针,指向数组的第一个元素。
    • 示例:
int arr[5] = {1, 2, 3, 4, 5}; // arr 是数组名
  • 指针
    • 指针是一个变量,用于存储内存地址。
    • 指针可以指向任何类型的数据,包括数组。
    • 示例:
int *p = arr; // p 是指针,指向数组 arr 的第一个元素

2. 内存分配

  • 数组
    • 数组的内存大小在编译时确定,是静态分配的。
    • 示例:
int arr[5]; // 分配了 5 * sizeof(int) 字节的内存
  • 指针
    • 指针本身只存储一个地址,指向的内存可以是静态分配的,也可以是动态分配的。
    • 示例:
int *p = (int *)malloc(5 * sizeof(int)); // 动态分配内存

3. 访问方式

  • 数组
    • 通过下标访问数组元素。
    • 示例:
int x = arr[2]; // 访问数组的第3个元素
  • 指针
    • 通过解引用访问指针指向的值。
    • 示例:
int x = *(p + 2); // 访问指针 p 指向的第3个元素

4. 大小计算

  • 数组
    • sizeof(arr) 返回数组的总字节数。
    • 示例:
int arr[5]; 
printf("%zu\n", sizeof(arr)); // 输出 20(假设 int 为4字节)
  • 指针
    • sizeof(p) 返回指针变量的大小(通常是4或8字节)。
    • 示例:
int *p; 
printf("%zu\n", sizeof(p)); // 输出 8(64位系统)

5. 可修改性

  • 数组
    • 数组名是常量指针,不能修改其指向。
    • 示例:
int arr[5]; 
arr = NULL; // 错误:数组名不可修改
  • 指针
    • 指针是变量,可以修改其指向。
    • 示例:
int *p = arr; 
p = NULL; // 合法:指针可以修改

6. 函数参数传递

  • 数组
    • 数组作为函数参数时,退化为指针。
    • 示例:
void func(int arr[]) { // arr 实际上是指针 }
  • 指针
    • 指针作为函数参数时,传递的是地址。
    • 示例:
void func(int *p) { // p 是指针 }

7. 多维数组与指针

  • 多维数组
    • 多维数组的内存是连续的。
    • 示例:
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
  • 指针数组
    • 指针数组的每个元素是一个指针。
    • 示例:
int *arr[2]; // arr 是指针数组

8. 常见误区

  1. 数组名是指针
  • 数组名是常量指针,不能修改其指向。
  • 示例:
int arr[5]; 
int *p = arr; // 合法 arr = p; // 错误:数组名不可修改
  1. 指针与数组的等价性
  • 在某些情况下,指针和数组可以互换使用,但它们的本质不同。
  • 示例:
int arr[5]; 
int *p = arr; 
printf("%d\n", arr[2]); // 合法 printf("%d\n", p[2]); // 合法


  1. 动态分配的多维数组

动态分配的多维数组需要使用指针的指针。

示例:

int **arr = (int **)malloc(2 * sizeof(int *)); 
for (int i = 0; i < 2; i++) { 
  arr[i] = (int *)malloc(3 * sizeof(int)); 
}

总结

特性

数组

指针

定义

连续内存空间

存储地址的变量

内存分配

静态分配

静态或动态分配

访问方式

下标访问(arr[i])

解引用访问(*(p + i))

大小计算

sizeof(arr) 返回总字节数

sizeof(p) 返回指针大小

可修改性

数组名不可修改

指针可修改

函数参数

退化为指针

直接传递地址

多维形式

多维数组

指针数组或指针的指针

理解指针和数组的区别与联系,是掌握C语言内存管理和高效编程的关键。

相关推荐

全球仅 1 辆!粉橙“郁金香”GT4 RS炸街,赞德沃特周末围观指南

“各位直男同胞,如果你女友突然送你一束‘郁金香’,别急着感动——万一钥匙在手,0-100km/h3.4秒,你会先感动还是先腿软?”...

国际足坛那些与国旗无关的国家队球衣

在世界足坛,国家队的球衣颜色一般都与国旗的颜色有关,不过也有例外。都知道意大利球衣由绿白红三色组成,但意大利球衣却是蓝色的,这是为什么呢?事实上意大利从1922年起就穿蓝色球衣,而那是当时意大利王室的...

世界主权国家国旗一览(欧洲篇)_世界国家的旗帜

1、芬兰(芬兰共和国)2、瑞典(瑞典王国)3、挪威(挪威王国)4、冰岛(冰岛共和国...

“黑色”机场:17国国旗全降半旗,荷兰王室和政府成员沉默以待

8年前,也就是2014年的7月23日,荷兰国王夫妇一身深沉黑装走在队伍的最前沿,身后跟着的是政府总理以及部分高级官员,没有例外,这些人的着装全都是清一色的黑装。不仅于此,机场上空的17个国家国旗也全部...

LiveScore为范戴克庆生:史上唯一举起英超奖杯的荷兰队长

今天是利物浦队长范戴克的34岁生日,媒体LiveScore晒出海报为范戴克庆生。海报中,范戴克身披荷兰国旗,手举英超奖杯。LiveScore写道:“祝范戴克生日快乐!史上唯一举起英超奖杯的荷兰队长!...

为何很多国家都用三色条纹国旗?_为什么很多国家国旗是三道杠

为何很多国家都用三色条纹国旗?你有没有发现,很多国家的国旗都是三种颜色的条纹旗,荷兰、俄罗斯、法国的国旗甚至连颜色都一样,实在是很难区分。据统计,世界上近1/3的国家都用的是三色条纹旗:俄罗斯是横着的...

西欧12个国家国旗的设计者和由来_西欧12个国家国旗的设计者和由来简介

1、法国国旗的设计者:答:雅克·路易·大卫:出生于法国巴黎,法国新古典主义画派画家,毕业于法国皇家绘画雕塑院。1794年设计的三色旗被正式采用为法国国旗。2、俄罗斯国旗的设计者:答:彼得一世:出生于莫...

世界杯再现橙色风暴,荷兰队为何要穿橙色?原因竟是个谐音梗

在世界杯上的荷兰队,总是给人留下深刻的印象。大开大合的全攻全守踢法,两翼齐飞的性感足球让人过目不忘。作为球迷,首先希望橙色军团荷兰队能在2022年,再次掀起郁金香风暴。荷兰队的橙色球衣给人以青春活力的...

国旗太像了!欧洲人自己也分不清,闹了不少笑话

国旗是一个国家身份的象征。但很多小伙伴都发现了,欧洲很多国家的国旗都十分相似,“傻傻分不清”。...

每日一旗——西欧篇荷兰_荷兰 西欧

从这期文章开始,我将在每一期文章里给大家介绍一面国旗,(希望我能够坚持下去...

剧荒吗?爱奇艺高热度“谍战剧”TOP5,剧粉不容错过!

Win2000服务器配置共享权限的老问题至今还在坑人,运维稍不留神就被各种"访问被拒"搞崩溃。关键得揪住三个死结:SMB协议兼容性、跨系统认证机制、权限继承逻辑,少一个环节全网瘫痪。W...

紧急 全球爆发比特币勒索病毒攻击,紧急应对措施!

北京时间2017年5月12日20时左右,全球爆发大规模勒索软件感染事件,我国大量行业企业内网、阿里云等大规模感染,教育网受损严重,攻击造成了教学系统瘫痪,甚至包括校园一卡通系统。判定该勒索软件是...

曾利用驱动人生升级通道传播的木马下载器攻击方法再次升级

一、概述御见威胁情报中心1月25日再次监测到曾利用驱动人生升级通道传播的木马下载器攻击方法再升级。本次升级主要变化在于攻击模块,木马在之前的版本上,新增计划任务“DnsScan”,在其中将永恒之蓝攻击...

【建议收藏】292个聚丙烯牌号性能、用途汇总!

聚丙烯(PP)作为五大通用塑料之一,其产量占据着世界第二把交椅,国内产量也是不可小觑。...

系统小技巧:改变Windows 10默认登录验证方式

在早期的WindowsXP或Vista系统中,密码凭据是登录系统的唯一选项。Windows10则大大不同,它在登录时能够提供包括本地账户密码、网络账户密码、Pin码、图形码以及其他各种验证识别方式...