我正在阅读 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#编写代码,如果你想访问多维数组,你需要几个参数,但这里只有一个,我真的很困惑......
答案 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
的行的索引,这是不合理的。
gradient
为const 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]
)。