给定数组本身的地址,如何在 C 中获取数组元素的地址?

How do you get the address of array elements given the address of the array itself in C?

*编辑以澄清数组未知

如果未知整数数组的地址是0x00006ffd29c78e70(一个整数是4字节),元素数组[1]的地址是多少?

非常感谢。

数组的地址也是它第一个元素的地址。这是因为内存中的数组本身仅由它的每个元素(从索引 0 开始)依次组成。因此,如果 A 是一个数组,那么 &A[0] 指向与 A 相同的内存。 (请注意,整数类型数组和指向整数类型的指针之间存在技术差异,尽管在许多情况下它们可以互换,因为前者在某些情况下会衰减为后者,这超出了本问题的范围;这是为什么我将它们描述为指向同一内存)。

您询问了第一个元素,然后提到了A[1]。请注意 A[1] 是第二个元素。 A[0] 是第一个元素。

因此在您的特定示例中,您可以这样做:

int *A = (int *)0x00006ffd29c78e70;
int *A1 = &A[1]; // points to second element
int foo = *A1; // second element contents

或使用指针算法

int *A = (int *)0x00006ffd29c78e70;
int *A1 = A+1; // points to second element
int foo = *A1; // second element contents 

请注意 +1 不会将(字节)地址加一,而是将指针递增一 int

注意我在上面写了 int - 使用正确的整数数据类型来表示您的 4 字节整数。

如果 0x00006ffd29c78e70int 的有效数组的地址,那么您可以将它分配给一个指针:

int *p = (int*)0x00006ffd29c78e70;

然后 p[1] 将为您提供该数组中的下一个元素(第二个)。

元素位于

unsigned char *addressofarray = whatever;
unsigned char *secondelement = addressofarray + sizeof arrayelement;
unsigned char *nthelement = addressofarray + n * sizeof arrayelement;

你刚刚得到一个指针来访问数组中的任何内容:

  int *ptr = (int*) 0x00006ffd29c78e70;          

您可以访问任何元素:

 *(ptr+i) //i is the index