arrays - 为什么这段代码的输出是 2 而不是 8?
问题描述
int main()
{
int array[5];
int *p,*q;
p =&array[1];
q=&array[3];
printf("%d\n",q);
printf("%d\n",p);
printf("%d",q-p);
return 0;
}
p
和的内存q
也打印出来了,但是为什么差是2而不是8呢?
解决方案
您正在调用指针算法。当您有两个指向同一数组中元素的指针时,减去这些指针会得到地址之间的字节差除以取消引用的指针类型的字节大小。因此,减去两个指针的结果是它们地址之间的元素数,而不是您所期望的字节数。
因此,在您的情况下,您正在减去int*
指针,并且sizeof(int)
在编译器中显然是 4 个字节,因此 and 的地址之间有 8 个字节,即&array[1]
and之间的&array[3]
2 个int
元素。array[1]
array[3]
---------------------
| 0 | 1 | 2 | 3 | 4 |
---------------------
^ ^
p q
p = 0xBE460A94
q = 0xBE460A9C
试试这个,你会看到 8:
int main()
{
int array[5];
char *p, *q;
p = (char*) &array[1];
q = (char*) &array[3];
printf("%p\n", q);
printf("%p\n", p);
printf("%d", q - p);
return 0;
}
相同的地址,但不同的指针类型,所以不同的结果。
推荐阅读
- r - 如何反转列联表以获取R中的数据
- mongodb - 由于从 Mongo 4.2 升级到 4.4(现在是 4.4.1)无法通过 Mongoose 从 WSL 中的节点连接
- spring - 使用 Spring Websocket STOMP Java 从客户端向服务器发送消息
- terraform - Localstack - AWS API Gateway 使用 Terraform 启用二进制支持
- checkbox - 基于复选框的加减值
- elasticsearch - 锚标记替换模式到标记的末尾
- neo4j - Neo4J 编写密码查询的正确方法
- weblogic12c - Weblogic 12.1.3 到 12.2.1 升级
- ios - 将 UIView 的掩码与多个其他视图一起使用
- angular - 上传和预览 GLTF 文件 (3D)