我需要这样做才能在矩阵上持续操作.这是否意味着它需要通过引用传递?
这还够吗?
void operate_on_matrix(char matrix[][20]);
我有一个关于C/C++如何在内部存储使用符号声明的多维数组的问题foo[m][n].我不是在质疑指针的纯指针等等......因为速度原因,我在问...
如果我错了,请纠正我,但语法上foo是一个指针数组,它们本身指向一个数组
int foo[5][4]
*(foo + i) // returns a memory address
*( *(foo + i) + j) // returns an int
Run Code Online (Sandbox Code Playgroud)
我从很多地方听说过C/C++编译器foo[m][n]在幕后转换为一维数组(计算所需的一维索引i * width + j).但是如果这是真的那么以下就可以了
*(foo + 1) // should return element foo[0][1]
Run Code Online (Sandbox Code Playgroud)
因此我的问题foo[m][n]是:(总是吗?)存储在内存中作为平面一维数组是真的吗?如果是这样,为什么上面的代码如图所示.
我有以下类型:
std::vector<std::vector<int>> indicies
Run Code Online (Sandbox Code Playgroud)
其中内部向量的大小始终为2.问题是,向量在内存中是非连续的.我想用连续的东西替换内部向量,以便我可以抛出扁平数组:
int *array_a = (int *) &(a[0][0])
Run Code Online (Sandbox Code Playgroud)
如果新类型有[]运算符会很好,所以我不必更改整个代码.(如果有必要,我也可以自己实施).我的想法是:
std::vector<std::array<int, 2>>
Run Code Online (Sandbox Code Playgroud)
要么
std::vector<std::pair<int, int>>
Run Code Online (Sandbox Code Playgroud)
这些在内存中看起来如何?我写了一个小测试:
#include <iostream>
#include <array>
#include <vector>
int main(int argc, char *argv[])
{
using namespace std;
vector<array<int, 2>> a(100);
cout << sizeof(array<int, 2>) << endl;
for(auto i = 0; i < 10; i++){
for(auto j = 0; j < 2; j++){
cout << "a[" << i << "][" << j << "] "
<<&(a[i][j]) << endl;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这导致:
8
a[0][0] …Run Code Online (Sandbox Code Playgroud) 我可以确定以下代码可以工作吗?
int sum_array(int *array, size_t size)
{
int i;
int sum = 0;
for (i=0;i<size;i++)
sum += *(array+i);
return sum;
}
int main()
{
int two_d_array[4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};
int sum = sum_array(&two_d_array[0][0], 12);
printf("%d", sum);
}
Run Code Online (Sandbox Code Playgroud)
虽然将4 x 3数组完全像12个元素的数组那样布置在内存中是合理的,但是可以保证吗?由于我似乎在欺骗类型系统,因此我不确定会出问题(例如,将填充添加到int [3])。
如果您可以详细说明如果我在数组中使用int以外的东西会发生什么,并提供标准的相关报价,则可以加分。
我们可以将2d数组作为单个指针传递,也可以传递双指针.但在第二种情况下,输出不如预期.那么第二个代码有什么问题?
方法1:
#include <stdio.h>
void print(int *arr, int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d ", *((arr+i*n) + j));
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3, n = 3;
print((int *)arr, m, n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)
方法2:
#include <stdio.h>
void …Run Code Online (Sandbox Code Playgroud)