通过指针访问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数组,只是大小不同。对不起,代码太乱了,你的代码贴得不够多。具体来说,定义了主要的内部协调。编辑你的问题并把它放在那里。