只用一个参数访问c多维数组?

时间:2017-12-06 04:10:34

标签: c arrays pointers

我正在阅读 C 代码,我发现很难理解发生了什么。

这是数组:

static const char   gradient[32][4] =
{
{ 1,  1,  1,  0}, { 1,  1,  0,  1}, { 1,  0,  1,  1}, { 0,  1,  1,  1},
{ 1,  1, -1,  0}, { 1,  1,  0, -1}, { 1,  0,  1, -1}, { 0,  1,  1, -1},
{ 1, -1,  1,  0}, { 1, -1,  0,  1}, { 1,  0, -1,  1}, { 0,  1, -1,  1},
{ 1, -1, -1,  0}, { 1, -1,  0, -1}, { 1,  0, -1, -1}, { 0,  1, -1, -1},
{-1,  1,  1,  0}, {-1,  1,  0,  1}, {-1,  0,  1,  1}, { 0, -1,  1,  1},
{-1,  1, -1,  0}, {-1,  1,  0, -1}, {-1,  0,  1, -1}, { 0, -1,  1, -1},
{-1, -1,  1,  0}, {-1, -1,  0,  1}, {-1,  0, -1,  1}, { 0, -1, -1,  1},
{-1, -1, -1,  0}, {-1, -1,  0, -1}, {-1,  0, -1, -1}, { 0, -1, -1, -1},
};

并且它是32 * 4,这是尝试访问此数组的代码的另一部分:

const char * g0000 = gradient[Indice (x1, y1, z1, t1)];

Indice是一个返回int的函数。那么g0000是什么(我知道它是一个指针),说Indice返回1,g0000的值是多少?我主要用 C#编写代码,如果你想访问多维数组,你需要几个参数,但这里只有一个,我真的很困惑......

3 个答案:

答案 0 :(得分:3)

gradient的类型是static const char[32][4],即二维chars数组。当您使用[]运算符取消引用两次时,您会获得char

但在这种情况下,只有在您const char[4]const char*贬为g0000并被分配到g0000后才能尊重。

准确地说,如果Indice(x1, y1, z1, t1)返回1,var friends = [ { id: 1, name: 'Paul' }, { id: 2, name: 'Mary' }, { id: 3, name: 'The others' }, { id: 4, name: 'John' } ]; var notConsidered = friends.filter(friend => friend.name == 'The others'); var friend = friends.filter(friend => friend.name!= 'The others'); var sortedfriend = friend.sort(function (a, b) { if (a.name < b.name) return -1; else if (a.name > b.name) return 1; return 0; }); sortedfriend.unshift(notConsidered[0]) console.log(sortedfriend);将保留第二个子阵列的地址。

答案 1 :(得分:2)

静态多维数组作为一维数组存储在内存中的方式(在C中)。

例如,如果您有以下数组:

int ray[2][3] = {{1, 2, 3}, {4, 5, 6}};

内存分配与以下内容完全相同:

int ray[6] = {1, 2, 3, 4, 5, 6};

这可以通过以下代码段显示:

int ray[2][2] = {1, 2, 3, 4};
int *rayP = (int *) ray;
printf("%d\n", rayP[3]);     //PRINTS 4

你可以使用多个索引的原因只是让你的生活更容易用作2D数组抽象。

因此,如果您访问数组ray[x][y]的元素ray[a][b],您实际访问的元素是ray[x * b + y],即使C不允许您这样做以保持抽象清晰

相反,如果您尝试直接访问元素ray[x],它会返回&ray[x * b],这正是您想要的:

指向所需子阵列开头的指针,您可以将其视为数组。

答案 2 :(得分:0)

假设Indice()返回gradient中包含4个值x1, y1, z1 and t1的行的索引,这是不合理的。

gradientconst char[32][4],说Indice会返回i中使用的索引gradient

gradient[i] 

是指向char的地址;计算的地址gradient[i]

g0000 = gradient[i]

gradient + ( i*4*sizeof(gradient[0][0]) )

也就是说,它指向地址&gradient[i][0]

处的渐变的第一个元素

在C中没有自动控制数组越界索引,在该数组中,访问[R][C]就像访问[R*4+C],这意味着g0000指向{{1}在char区域,您可能会尝试超出该4限制(例如[4])并访问下一行(因为它是[i][5][i*4+5])。

但是,在界限内访问数组会导致未定义的行为(如果是[i+1][1],那么由于数组i+1 > 31[X]变为[0])。