2017-03-21 123 views
-2

我想创建一个包含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; 
} 

我在主要测试这一点,我不能找到一种方法来访问任何东西,但每个阵列中的第一个值。我不确定第一列显示的是什么,第二列是每个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 
+0

** vec10-vec100000,up **和** down **是int数组吗?他们来自哪里?如果是这种情况,你的** arr **参数应该是函数签名中的一个二维数组:'void randomGen(int ** arr)',然后你可以使用arr [i] [j]来访问它的值,其中**我**和** j **代表您的行和正在访问的列。 – 0xDEFACED

+0

是的,这些向量是int数组。我尝试了你的建议@圣地亚哥瓦雷拉,我得到一个不良访问错误。我做了以下调整:'int ** a;'在randomGen函数中声明为main,'void randomGen(int ** arr){'和'arr [0] = vec10;',并且for(int i = 0; i <10; i ++){cout <

回答

-1

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

// 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; 
} 

由于这些阵列WHI你要“存储”在arr有不同的类型(绑定),唯一的选择是存储每个数组的第一个元素的地址,即& 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]