c - 如果 array_name 是一个指针 int *ptr = array_name 不是指向指针的指针
问题描述
我是 C 的初学者,最近发现数组名称是指向数组第一个元素的地址的指针,这是一个非常容易理解的概念,因为指针是一个保存内存地址的变量。
int x[4];
printf("%p",x); // x is a pointer
我无法理解的是以下代码:
int x[4], *ptr;
ptr = x;
这很简单,但是第二行ptr = x
指向指针x
,这不会使ptr
指针指向我需要声明ptr
为的指针int **ptr
吗?如果我的理解没有记错的话,x
存储x[0]
这样做的地址ptr = x
,是ptr
指向另一个指针,这x
使得它本质上是指向一个指针的指针。
解决方案
数组不是指针。
但首先,让我们看一下作业。假设你有:
int SomeInt;
int *a = &SomeInt;
此时a
指向SomeInt
。然后我们这样做:
int *b;
b = a;
这是做什么的?它设置b
等于a
。它没有b
说明a
。赋值后,b
具有与 相同的值a
,所以b
指向同一个地方a
指向;它指向SomeInt
. 它不指向a
。
同样,您ptr = x;
没有ptr
指出x
. 它ptr
等于表达式的值x
。
但是,在这种情况下,该值不是数组,因为发生了自动转换。我们将在下面讨论。
回到不是指针的数组,之后int x[4];
,x
是四个数组的名称int
。如果使用 打印数组的大小,则在 4 字节printf("%zu\n", sizeof x);
的系统上将得到 16 int
,因为数组的大小为 16 字节。这是因为x
数组是数组,数组sizeof x
的大小也是。
但是,当您编写 时ptr = x;
,它不会将数组分配给ptr
。它将指向第一个元素的指针分配给ptr
. 这是如何运作的?
因为早期的 C 语言不支持处理整个数组,例如将一个数组分配给另一个数组,所以您只能通过指针来处理它们。因此,要将指针设置为指向数组的第一个元素,您必须编写ptr = &x[0];
. 为了使这更容易,该语言旨在允许您改为编写ptr = x;
。当您以这种方式使用数组时,它会自动转换为指向其第一个元素的指针,就像您写&array[0]
的不是array
.
每当在表达式中使用数组时,都会发生自动转换,除非它是 的操作sizeof
数、一元的操作数&
或用于初始化数组的字符串文字。
推荐阅读
- python - 应用程序与 buildpack 不兼容,django heroku
- ssh - 如果条件在 ssh 内失败
- c++ - 将表单 py2 更改为 py3 后,PyImport_Import 不能与 BOOST_PYTHON_MODULE 一起使用
- javascript - 有没有一种方法可以添加地图框悬停弹出窗口而无需废弃此代码?
- database - 如何处理firebase中多个where查询的索引?
- karate - 空手道有睡眠选项吗?我试图在特定时间段(例如:1 分钟)后使用空手道脚本从 json 文件中删除一个变量
- javascript - odoo 14 中的 Onchange 函数
- sql-server-2012 - 计算两个表条目之间的天数差异并使用 SQL Server 在另一个表中更新它
- json - Flutter Rest Api 连接 - 如何获取数据?
- python-3.x - Pandas dates and events