【问题标题】:What is the difference between (*pointer)[] and *pointer? [duplicate](*pointer)[] 和 *pointer 有什么区别? [复制]
【发布时间】:2020-06-25 08:00:22
【问题描述】:

我有一个关于使用指针的问题。你能告诉我这两个指针的区别吗?

int array[10] = {1, };
int (*pointer1)[10] = &array;
int *pointer2 = array;

我很困惑,因为这两个指针可以做完全相同的事情......就像访问像 pointer1[0]pointer2[0] 这样的元素,我知道 pointer2 是一个元素指针,pointer1 是一个指向整个数组的指针。但是我不知道程序员为什么要区分这两者。

【问题讨论】:

    标签: c arrays pointers


    【解决方案1】:

    在大多数情况下,数组名称衰减为指针。简单来说,数组名称被转换为指针。这就是您可以使用指针访问数组元素的原因。但是,您应该记住,指针和数组是不一样的。

    由于C中的数组可以衰减为相同数据类型的指针,(数组名可以衰减为数组的地址或第一个元素的地址相同)

    我们可以写:

    int* ptr = array;
    

    ptr 是指向数组开始的新数据类型。

    现在常见的是: pointer1pointer 2 在内存中持有相同的地址指向相同的地址。

    但它们之间有一些区别:

    pointer1 是指向 10 种整数数据类型的数组的指针,其中 pointer2 是指向一种整数数据类型的指针。

    derefrence指针: pointer2 deref 到一种 int 数据类型,其中 pointer1 deref 到 10 个 int 的数组。所以我们可以使用pointer1

    (*pointer1)[5]=1000;
    

    但这将在pointer2 中有效。

    pointer2 中的等价物将是:

    *(pointer2+5)=1000;
    

    指针算法对两者都有效,但增量的结果不同:

    int* ptr_new = pointer1 + 1; 
    

    pointer1 增加sizeof the whole array(10 个整数),现在 ptr_new 指向最后一个元素。

    int* ptr_new = pointer2 + 1;
    

    pointer2 增加sizeof(int),现在ptr_new 指向数组中的second 元素。

    【讨论】:

    • @Gazelgoes - 我很高兴。谢谢你的问题。
    【解决方案2】:

    数组衰减为指向其第一个元素的引用的指针。

    int array[10];
    

    array 衰减为指向 int 的指针 &array[0] 衰减到指向 int 的指针 &array[ 衰减为指向 10 个元素的 int 数组的指针

    指向 int 的指针和指向 int 数组的指针有什么区别?它们引用不同类型的对象,并且它们的算术根据示例不同:

    int array[10] = {1, };
    int (*pointer1)[10] = &array;
    int *pointer2 = array;
    
    int main(void)
    {
        printf("sizeof(int) is: %zu, sizeof(*pointer2) is: %zu, sizeof(*pointer1) is: %zu\n", sizeof(int), sizeof(*pointer2), sizeof(*pointer1));
    
        printf("pointer1 = %p,  (pointer1 + 1) = %p, (pointer1 + 1) - pointer1 = %zu\n", (void *)pointer1, (void *)(pointer1 + 1), (uint8_t *)(pointer1 + 1) - (uint8_t *)(pointer1));
        printf("pointer2 = %p,  (pointer2 + 1) = %p, (pointer2 + 1) - pointer2 = %zu\n", (void *)pointer2, (void *)(pointer2 + 1), (uint8_t *)(pointer2 + 1) - (uint8_t *)(pointer2));
    }
    

    结果:

    sizeof(int) is: 4, sizeof(*pointer2) is: 4, sizeof(*pointer1) is: 40
    pointer1 = 0x404040,  (pointer1 + 1) = 0x404068, (pointer1 + 1) - pointer1 = 40
    pointer2 = 0x404040,  (pointer2 + 1) = 0x404044, (pointer2 + 1) - pointer2 = 4
    

    https://godbolt.org/z/BwbfQy

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 1970-01-01
      • 2012-11-07
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2022-06-19
      • 2011-04-30
      相关资源
      最近更新 更多