如何通过 C 中的地址更改数组的变量?

How to change array's variables by address in C?

我正在尝试通过交换地址而不是值来更改数组的变量地址。 我有一个交换数组中数字的函数: a[0]=a[9] , a[9]=a[0], 一个1=a[8] , a[8]=a1, a[2]=a[7] , a[7]=a[2], ec`。 如果您查看图像,例如在数组 arr[0] = 33 中,地址为 00...E8。 我想将它与最后一个数字交换为 arr[0] = 10,地址为 00..0C。 现在我有 arr[0] = 10,地址 00...E8,我切换了值而不是地址。

我该如何实现?

#include <stdio.h>
#include <stdlib.h>
#include<time.h>


void invert(int arr[], int size)
{
    int n;
    int temp;
    for (n = 0; n < size / 2; n++)
    {
        temp = arr[n];
        arr[n] = arr[size - 1 - n];
        arr[size - 1 - n] = temp;
    }
    printf("after invertion");
    printf("\n");
    for (n = 0; n < 10; n++)
    {
        printf(" %d ", arr[n]);
        printf(" %p\n", &arr[n]);
    }

}
void main()
{
    int arr[10];
    int i;

    srand(time(NULL));
    for (i = 0; i < 10; i++)
    {
        arr[i] = rand() % 50;
    }

    printf("before invertion");
    printf("\n");
    for (i = 0; i < 10; i++)
    {
        printf(" %d ", arr[i]);
        printf(" %p\n", &arr[i]);
    }
    printf("\n");
    invert(arr, 10);
}

不能交换数组元素的地址。数组元素全部按顺序存储在内存中。如果一个整数在内存中占用 4 个字节,对于大小为 10 的数组,总共在内存中占用 40 个连续字节。数组 a 指向这 40 个字节的开始地址,当你索引它时,索引乘以 sizeof(int) = 4。因此,a[1]的地址等于a的地址+4,a[9]的地址等于a的地址+9*4。

如图所示,数组元素的地址都是连续的,仅相差 4 个字节。例如,您可以说 a = a + 20,这会导致 a[0] 指向 a[5],但随后数组元素的其余部分也会移位,并将指向之后的位置,如上文所述。从技术上讲,您只能更改数组开头指向的位置,而不能更改数组中间指向的位置。