C语言中的数组并非指针:深入理解数组和指针的区别
创作时间:
作者:
@小白创作中心
C语言中的数组并非指针:深入理解数组和指针的区别
引用
CSDN
1.
https://blog.csdn.net/suifengme/article/details/141033376
在C语言中,数组和指针是两个非常重要的概念,它们在很多方面有着紧密的联系,但也存在显著的区别。尽管数组名有时可以像指针那样使用,但它们本质上并不是一回事。理解这些差异对于编写正确和高效的代码至关重要。本文将深入探讨数组和指针的区别,并提供一些示例代码。
数组与指针的基础概念
- 数组:数组是一系列相同类型数据的集合,它们在内存中连续存储。数组名本身是一个常量,指向数组的起始位置。
- 指针:指针是一个变量,其值为另一个变量的地址。指针可以指向数组中的任何一个元素。
数组与指针的相似之处
尽管数组和指针有很多不同之处,但它们在某些方面确实很相似:
- 数组名作为指针:在许多上下文中,数组名可以被用作指向数组第一个元素的指针。
- 指针算术:指针可以进行算术运算,如
ptr + 1,这同样适用于数组名。
数组与指针的主要区别
现在让我们来看看数组和指针之间的一些关键区别:
3.1 数组名是常量
数组名始终指向数组的起始位置,不能被重新赋值为指向其他位置的地址。
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // arr 被视为指向第一个元素的指针
printf("Value at arr: %d\n", *arr); // 输出 1
printf("Value at ptr: %d\n", *ptr); // 输出 1
// 下面的代码会导致编译错误
// arr = ptr; // 错误:数组名不能被重新赋值
return 0;
}
输出:
Value at arr: 1
Value at ptr: 1
解释:
int *ptr = arr;将arr视为指向第一个元素的指针。arr = ptr;导致编译错误,因为数组名不能被重新赋值。
3.2 数组名与指针的类型不同
数组名的类型与指针的类型不同,这在函数参数传递时尤为明显。
#include <stdio.h>
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
printArray(arr, 5); // arr 被传递给函数
return 0;
}
输出:
1 2 3 4 5
解释:
void printArray(int arr[], int size)接受一个数组作为参数。printArray(arr, 5);传递数组给函数。
3.3 数组作为函数参数时的退化
当数组作为函数参数时,它会退化为指针,这意味着传递给函数的是数组首元素的地址,而不是整个数组。
#include <stdio.h>
void printArray(int arr[], int size) {
// arr 在这里被视为指针
printf("Address of arr in function: %p\n", (void *)arr);
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
printf("Address of arr in main: %p\n", (void *)&arr);
printArray(arr, 5); // arr 作为指针传递给函数
return 0;
}
输出:
Address of arr in main: 0x7fff5fbff3e0
Address of arr in function: 0x7fff5fbff3e0
解释:
printArray(arr, 5);传递数组给函数。arr在函数中被视为指向数组第一个元素的指针。
3.4 数组大小的信息丢失
当数组作为函数参数时,编译器不知道数组的实际大小。这可能导致潜在的问题,如越界访问。
#include <stdio.h>
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
printArray(arr, 5); // 正确
printArray(arr, 10); // 可能导致越界访问
return 0;
}
输出:
1 2 3 4 5
解释:
printArray(arr, 10);可能导致越界访问。
数组与指针的高级用法
数组和指针在高级编程中有着广泛的应用,例如多维数组、指针数组等。
4.1 多维数组与指针
多维数组可以被视为指针数组。
#include <stdio.h>
void printMatrix(int (*matrix)[3], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
printMatrix(matrix, 2); // 传递多维数组给函数
return 0;
}
输出:
1 2 3
4 5 6
解释:
void printMatrix(int (*matrix)[3], int rows)接受一个指针数组作为参数。printMatrix(matrix, 2);传递多维数组给函数。
结论
数组和指针在C语言中有着密切的关系,但它们之间也存在着明显的区别。理解这些差异对于编写正确和高效的代码至关重要。通过上述示例,你应该已经了解了数组和指针之间的主要区别。这种能力对于处理复杂的数据结构和编写更高效的程序非常有帮助。
热门推荐
春季脑梗高发,医生提醒:四类食物和三个习惯要当心
广东VS江苏:谁的红包更豪?
压岁钱攀比之风愈演愈烈,年轻人如何应对?
压岁钱里的财商课:从传统习俗到现代理财教育
“洛杉矶2.0”:一场耗资25亿美元的灾后重建攻坚战
梦见猫:神秘梦境的多重解读
为了能在南极养猫,一场焦心的斗争开始了
广西文旅大会聚焦融合发展,入境游增长超267%
广西一季度经济增速3.1%:工业增势较好,投资却降20.4%
北京燃气集团充值指南:多种渠道任你选
香港罕见病患者确诊平均耗时1年半,专家建议建立一站式服务
北京举办罕见病保障研讨会,专家献策破解用药难题
又快又省的短途游,年轻人爱了
短暂逃离!6条短途游路线推荐,用1-2天,离开城市,完成一次心灵自愈!
从医院到家庭:罕见病患者个案护理实践指南
破解罕见病患者心理困境:多学科团队协作的实践路径
AAV2基因疗法让罕见病患儿重获运动能力
挑战职场困境:5步战胜倦怠,找回工作动力与乐趣!
陕西优艺墨堂心理咨询公司【深度剖析】青少年抑郁与学习动力缺失
新年DIY生日礼物攻略:给同学一个惊喜
鸡年生日礼物大揭秘:传统与创意碰撞
远程连接服务器失败的原因及解决方法
新房交房时需要支付哪些额外费用?
门面房过户费用及税费详解
禁忌之恋《缘之空》:二次元文化中的伦理探讨
经典恋爱游戏《缘之空》1月27日登陆Steam,支持简繁中文
面部穴位按摩入门:29个穴位详解与按摩步骤
面部穴位按摩全攻略:16个穴位详解与美容养生方法
济南严查“毒枸杞”:宁夏青海货源为主,专家教你辨别
42条中医养生指南:从理论到实操详解