单个数组方括号内的嵌套索引

3

我从未见过这样的情况,即使我已经读过有关数组的内容。数组在方括号中有2个索引,其中一个嵌套在另一个方括号中:

printf("%d ", arr[chosen[i]]); 

如果方括号内有两个索引,我不知道会发生什么。

完整代码在这里:https://www.geeksforgeeks.org/combinations-with-repetitions/

4个回答

3

通过使用名为 chosen int 数组直接索引。

printf("%d ", arr[chosen[i]]); 

或者通过先保存值来间接地进行索引也是一样的。

int idx = chosen[i];
printf("%d ", arr[idx]); 

2
printf("%d ", arr[chosen[i]]);

chosen[i] 计算的是数组 chosen 的第 (i + 1) 个元素存储的值。

但我需要更多数据来说明这个情况。因此,让我们假设以下初始化:

int i = 2;
int chosen[4] = {1,5,7,9}
int arr[9] = {6,2,7,23,9,16,11,44,2};

假设i2,则chosen[i]指向数组chosen的第三个元素,并评估为值7。再重复一遍以便教学:chosen[i]i2时被评估为7。请注意,索引计数从0开始,因此chosen[2]表示数组chosen的第三个元素,而不是第二个。

之后,7将用于确定数组arr的第八个元素,a[7]a[7] = arr的第八个元素。

a[7]中包含值44。因此,我们通过以下方式打印44

printf("%d ", arr[chosen[i]]);

所以,
printf("%d ", arr[chosen[i]]); 

在我们的例子中,等同于:

printf("%d ", arr[7]);

为了再次说明这个关系:
chosen[i] = NUMBER;
buffer = chosen[i];
printf("%d ", arr[buffer]);

等同于

buffer = NUMBER;
printf("%d ", arr[buffer]);

这也等同于

count[i] = NUMBER;
printf("%d ", arr[count[i]);

当然也等价于:
printf("%d ", arr[NUMBER]);

1
你只需要逐步分解代码。
两个变量 chosenarr 声明为整数数组; 所以,我们先从 '内部' 开始计算 chosen[i] - 这将是数组 chosen 中给定位置(索引)的元素(整数)。
让我们称这个值为 chosen_int
然后,我们可以将表达式 arr[chosen[i]] 重新编写为 arr[chosen_int] - 这将是数组 arr 中给定索引值的元素(整数),由我们以前的(内部)表达式给出。
可能有助于清晰地写出我们刚刚做的事情,用下面这句话替换 '令人困惑' 的单行代码:
int chosen_int = chosen[i];
printf("%d ", arr[chosen_int]);

欢迎进一步询问和/或解释。


0

只是想在其他回复中补充一些内容。

我从未见过这样的东西...
printf("%d ", arr[chosen[i]]);

对我来说,这听起来非常奇怪,但它确实可能发生。

实际上没有什么奇怪的地方:如果你思考一下,就不会有歧义。一个括号对包含一个索引;该索引再次用数组表示法表示。

这可能对于改变庞大数组的顺序很有用。假设你有一个包含长结构体的数组。要对其进行排序,您应该交换大对象。但是,您可以通过交换其索引而不是对象本身来对其进行排序。或者,您可能希望能够在内存中维护不同的有序列表,所有这些列表都包含指向同一数组的索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接