引用指向数组的指针数组的值

Referencing values of an array of pointers to arrays

本文关键字:数组 指针 引用      更新时间:2023-10-16

>我正在尝试创建一个包含 8 个其他数组的数组。 我有一个函数将这些数组放在一个更大的数组中。 我在引用子数组中的数据时遇到问题:

void randomGen(int arr[]){
// fill vec10-vec1000000 with random values
arr[0] = *vec10;
arr[1] = *vec100;
arr[2] = *vec1000;
arr[3] = *vec10000;
arr[4] = *vec100000;
arr[5] = *vec100000;
arr[6] = *up;
arr[7] = *down;
}

我正在 main 中对此进行测试,除了每个数组中的第一个值之外,我找不到访问任何内容的方法。 我不确定第一列显示什么,第二列是 vec10-vec1000000 中每个条目中的第一个条目,第三列只是在第一个条目上迭代 +1。如何格式化它以便可以访问我的子数组?我的函数注定要失败吗?

First 4 elements of vec10: 12 5 9 17 
0: *(*(&a+i)): 12; *(a+i): 12; *(a)+i: 12
1: *(*(&a+i)): 0; *(a+i): 1144108930; *(a)+i: 13
2: *(*(&a+i)): 0; *(a+i): 984943658; *(a)+i: 14
3: *(*(&a+i)): 0; *(a+i): 1622650073; *(a)+i: 15
4: *(*(&a+i)): 0; *(a+i): 282475249; *(a)+i: 16
5: *(*(&a+i)): 0; *(a+i): 282475249; *(a)+i: 17
6: *(*(&a+i)): 0; *(a+i): 0; *(a)+i: 18
7: *(*(&a+i)): 0; *(a+i): 9999; *(a)+i: 19
8: *(*(&a+i)): 0; *(a+i): 0; *(a)+i: 20
9: *(*(&a+i)): 0; *(a+i): 0; *(a)+i: 21

以下代码片段可以帮助了解有关指针和数组的内容。

// say you have
int a[10], b[10], c[10];
// you can 
int *p[3] = {a, b, c}; // implicit conversion from int[10] to int *
// or
int (*pa[3])[10] = {&a, &b, &c};
// which is equivalent to
using Array10 = int[10];
using PointerToArray10 = Array10 *;
PointerToArray10 another_pa[3] = {&a, &b, &c};

// say you have
int d[10], e[11], f[12];
// you can still
int *pp[3] = {d, e, f};

// say you have
void randomGen(int arr[])
// there isn't anything you can do

你需要的是

void randomGen(int *arr[]) {
arr[0] = a; // no deference, the same a as declared before
arr[1] = f;
}

由于那些你想"存储"在arr中的数组有不同的类型(bound),唯一的选择是存储每个数组的第一个元素的地址,即&a[0]。 因此,Arr需要具有an array of pointers类型(此数组的每个元素都是一个指针)。

但是不能将数组声明为函数参数,它们总是会衰减到指针。所以这是交易,你在某处声明一个指针数组:

int *array[10];

然后将其传递给函数

randomGen(array);

该函数使用您传递的数组来初始化指向指针的指针,即int **arrint *arr[](它们在参数列表中相同),具有数组到指针的转换。而函数参数实际上会指向array的第一个元素,即&array[0].(array[0]有类型int *&array[0]有类型int **)

在函数内部,您可以通过指针访问原始数组的元素。

arr[0] // array[0]