c - (*pointer)[] 和 *pointer 有什么区别?
问题描述
我有一个关于使用指针的问题。你能告诉我这两个指针之间的区别吗?
int array[10] = {1, };
int (*pointer1)[10] = &array;
int *pointer2 = array;
我很困惑,因为这两个指针可以做完全相同的事情......比如访问像pointer1[0]
or这样的元素pointer2[0]
,我理解它pointer2
是一个元素指针,pointer1
是一个指向整个数组的指针。但是我不知道为什么程序员要区分这两者。
解决方案
在大多数情况下,数组名称衰减为指针。简单来说,数组名称被转换为指针。这就是您可以使用指针访问数组元素的原因。但是,您应该记住,指针和数组并不相同。
因为can 中的数组C
衰减为具有相同数据类型的指针,(并且数组的名称可以衰减为数组的地址或第一个元素的地址相同)
我们可以写:
int* ptr = array;
ptr 是指向数组开始的新数据类型。
现在有什么共同点:
pointer1
并pointer 2
在内存中保持相同的地址指向相同的地址。
但它们之间有一些区别:
pointer1
是指向 10 种整数数据类型的数组的指针,其中pointer2
是指向一种整数数据类型的指针。
当derefrence
指针:
pointer2
deref 到一种 int 数据类型,其中pointer1
deref 到 10 个 int 的数组。所以我们可以这样做pointer1
:
(*pointer1)[5]=1000;
但这将在pointer2
.
等价的pointer2
将是:
*(pointer2+5)=1000;
指针算术对两者都有效,但增量的结果不同:
int* ptr_new = pointer1 + 1;
递增pointer1
(sizeof the whole array
10 个整数),现在 ptr_new 指向最后一个元素。
int* ptr_new = pointer2 + 1;
递增pointer2
,sizeof(int)
现在 ptr_new 指向second
数组中的元素。
推荐阅读
- loops - 显示范围内给定数字的倍数
- r - 在闪亮的应用程序中基于用户输入(使用预定义的基于分类的调色板)为传单多边形着色
- ssis - 对于每个循环容器 SSIS
- c++ - 标准::设置
不会编译 - javascript - 带有延迟用户模块的身份验证模块
- node.js - 通过 WebStorm 运行/调试配置在 docker node.js 应用程序上设置私有 npm 注册表
- web-scraping - 不断保存在我的浏览器中打开的动态变化网页的内容
- javascript - 是否可以通过 office JS API 获取共同作者列表?
- android-studio - Android Studio 在布局编辑器模式下缺少一些属性,例如 fontFamily
- python - Seaborn 在 X 轴上呈现所有标签