Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过指针访问C++数组_C++_Arrays_Pointers_Parameters - Fatal编程技术网

通过指针访问C++数组

通过指针访问C++数组,c++,arrays,pointers,parameters,C++,Arrays,Pointers,Parameters,关于通过指针访问数组信息的一个简单问题,我似乎无法理解。我将一组多维数组传递到一个函数中。现在它们不是动态的,但即使是静态的,我也必须将它们作为指针传递,对吗?如果我错了,请纠正我 因此,一旦我将它们传递到函数中,我如何访问它 int main() { int anArray[5][5] = // member intializations foo(*anArray); } void foo(int * anArray) //or should that be int ** an

关于通过指针访问数组信息的一个简单问题,我似乎无法理解。我将一组多维数组传递到一个函数中。现在它们不是动态的,但即使是静态的,我也必须将它们作为指针传递,对吗?如果我错了,请纠正我

因此,一旦我将它们传递到函数中,我如何访问它

int main()
{
    int anArray[5][5] = // member intializations
    foo(*anArray);
}
void foo(int * anArray) //or should that be int ** anArray ??
{
    cout << anArray[2][2] << endl; // how should i address this..?
}

您可以像访问数组一样访问指针。所以你的foo函数是正确的。我在代码中看到的主要问题是这一行

foo(*anArray);
换成

foo(anArray);
或者如果你真的想说得很清楚

foo(&anArray[0][0])
现在,呃。。。嗯。。。几点建议。因为指针是一个数组是一个指针,你真的可以击中自己的脚。例如,在foo中,您知道传入的内存是指针,但您可能还希望传递其大小以进行适当的检查。许多缓冲区溢出都是由于假设数组大小不正确造成的。这称为缓冲区溢出,可能会导致您无意中覆盖程序内存其他部分的内存,希望您的程序会导致非常奇怪的行为。例如,程序中的堆栈变量可能会突然采用未指定的值


如果您有权访问std::vector或boost::array,我会推荐它们以避免缓冲区溢出问题。

您可以像访问数组一样访问指针。所以你的foo函数是正确的。我在代码中看到的主要问题是这一行

foo(*anArray);
换成

foo(anArray);
或者如果你真的想说得很清楚

foo(&anArray[0][0])
现在,呃。。。嗯。。。几点建议。因为指针是一个数组是一个指针,你真的可以击中自己的脚。例如,在foo中,您知道传入的内存是指针,但您可能还希望传递其大小以进行适当的检查。许多缓冲区溢出都是由于假设数组大小不正确造成的。这称为缓冲区溢出,可能会导致您无意中覆盖程序内存其他部分的内存,希望您的程序会导致非常奇怪的行为。例如,程序中的堆栈变量可能会突然采用未指定的值


如果您可以访问std::vector或boost::array,我会推荐它们以避免缓冲区溢出问题。

如果您的数组大小固定,可以通过以下方式执行:

void foo(int arr[5][5])
{
    cout << arr[2][2] << endl;
}

如果阵列的大小固定,可以通过以下方式进行:

void foo(int arr[5][5])
{
    cout << arr[2][2] << endl;
}

数组是在内存中连续排列的一系列对象

int blah[5][10];
是一个由5[10[int]s]s组成的数组

例如,blah[0]将为您提供第一个10整数数组,blah[1]将为您提供第二个整数数组,等等

为了能够计算内存偏移量,C需要准确地知道每个子数组中有多少个元素

所以你可以这么做

void foo(int anArray[][10]) {
    cout << anArray[2][2] << endl;
}

如果事先不知道数组的维度,则必须使用更复杂的数据结构。可以将数组的宽度/高度传递给函数,或者使用包含该信息的结构,并将二维数组解析为一维数组,如下所示:

int *arr = malloc(width*height * sizeof(int));
...
cout << arr[x + y * width] << endl;

数组是在内存中连续排列的一系列对象

int blah[5][10];
是一个由5[10[int]s]s组成的数组

例如,blah[0]将为您提供第一个10整数数组,blah[1]将为您提供第二个整数数组,等等

为了能够计算内存偏移量,C需要准确地知道每个子数组中有多少个元素

所以你可以这么做

void foo(int anArray[][10]) {
    cout << anArray[2][2] << endl;
}

如果事先不知道数组的维度,则必须使用更复杂的数据结构。可以将数组的宽度/高度传递给函数,或者使用包含该信息的结构,并将二维数组解析为一维数组,如下所示:

int *arr = malloc(width*height * sizeof(int));
...
cout << arr[x + y * width] << endl;

<>在C++中,数组实际上是指向第一个元素的指针。 传递*anArray时,其中anArray是anArray[5][5],传递的是单元格anArray[0]的内容,该单元格是指向整数数组的指针


这样,Foo函数应该得到一个指针:CuffOffiTn*InAdSnx/P>< P> C++中,数组实际上是指向第一个元素的指针。 传递*anArray时,其中anArray是anArray[5][5],传递的是单元格anArray[0]的内容,该单元格是指向整数数组的指针


所以foo函数应该是receive一个指针:void fooint*intanArray

看看链接不起作用。。显然找不到服务器。是它掉下来了还是只有我。。?thx Thought然后在URL前面加上cache:并键入google:查看链接是否无效。。显然找不到服务器。是它掉下来了还是只有我。。?thx thoughThen在URL前面加上cache:并输入google:我知道我声明为固定大小,但如果我想使用动态数组/指针,我将如何访问它?我知道我声明为固定大小,但如果我想使用动态数组/指针,我将如何访问它?一个问题。。如果我通过静态数组,不应该
int main中的数组是否足够?因为我遇到错误,无法将“int”转换为“int*”,因为数组的大小已经知道,所以我只需将数组的名称传递给foo。。。thx的帮助,顺便说一句,fooanArray不应该给你这个错误,因为anArray不是int。这是实际的代码,在int main,classifycoords,centroids,classified;和void classifydouble coords[8][2],双质心[3][2],int-classified[8]。我得到的错误是错误:无法将参数“1”的“double”转换为“double*,double*,int*”,这让我很反感,因为它没有抱怨第二个参数是相同类型的相同2d数组,只是大小不同。对不起,代码太乱了,你的代码贴得不够多。具体来说,定义了主要的内部协调。编辑你的问题并把它放在那里。。如果我通过静态数组,int main中的fooanArray是否就足够了?因为我遇到错误,无法将“int”转换为“int*”,因为数组的大小已经知道,所以我只需将数组的名称传递给foo。。。thx的帮助,顺便说一句,fooanArray不应该给你这个错误,因为anArray不是int。这是实际的代码,在int main,classifycoords,centroids,classified;和void classifydouble coords[8][2],双质心[3][2],int-classified[8]。我得到的错误是错误:无法将参数“1”的“double”转换为“double*,double*,int*”,这让我很反感,因为它没有抱怨第二个参数是相同类型的相同2d数组,只是大小不同。对不起,代码太乱了,你的代码贴得不够多。具体来说,定义了主要的内部协调。编辑你的问题并把它放在那里。