c - 如何理解这个指向 C 中数据结构的指针?
问题描述
我有这段代码,我想弄清楚第二行代码的作用。
static int table [][4]= {{1,2,3,4},{2,3,4,5},{3,4,5,6}};
int valore = *(*(table+2)+1);
printf("%d",valore);
我对C中的指针有基本的了解,你能解释一下第二行代码是做什么的吗?
解决方案
你table
只是一个二维整数数组。在 C 中,二维数组实际上是一个“数组或数组”。您table
的尺寸为static in table[3][4];
(3 行 x 4 列),它是一个由 3 个整数数组组成的数组,每个数组有 4 个元素。由于它是一个数组,所有值在内存中都是连续的。您可以将内存布局想象如下。
+---+---+---+---+
table[0] | 1 | 2 | 3 | 4 |
+---+---+---+---+
table[1] | 2 | 3 | 4 | 5 |
+---+---+---+---+
table[2] | 3 | 4 | 5 | 6 |
+---+---+---+---+
数组在访问时转换为指针(在 4 种有限的情况下接受,此处不相关,请参阅C11 标准 - 6.3.2.1 其他操作数 - 左值、数组和函数指示符(p3)了解详细信息)
在问题中向您介绍了“指针表示法”。您可以使用“数组索引”或“指针表示法”访问数组的任何元素。指针表示法*(a + b)
等同a[b]
于数组索引表示法。你有:
*(*(table+2)+1)
如果你一块一块地拿它*(table + 2)
是简单的table[2]
。接下来*(table[2] + 1)
就是简单了table[2][1]
。因此,您可以使用任一(简单地)访问第三行中的第二个值4
。
如果您还有其他问题,请仔细查看并告诉我。
推荐阅读
- neo4j - 在 GitHub 操作工作流程中通过 yml 安装两个 neo4j 服务器(在不同端口上运行)
- javascript - 如何使用 Javascript 捕获输入更改事件?
- python - Keras:带有卷积层的自动编码器
- elasticsearch - Elasticsearch 最佳分片计数
- python - 如何在python中只运行一次循环?
- google-cloud-platform - 如何在 Google Stackdriver Logging 高级查询中将字符串字段作为数字进行比较?
- angularjs - 如何使用 $http.get 发送更大的数据集?
- python - 为什么我无法在当前工作目录中找到或定位由 python 创建的“.txt”文件类型?
- spring-data - Spring Data JDBC如何持久化嵌套在另一个一对多关系中的一对多集合
- laravel - 我的主机不允许我在 Cron 工作中使用“>”和“&”