C 数组的结构化链表

C 数组的结构化链表,c,arrays,pointers,malloc,C,Arrays,Pointers,Malloc,有人能解释一下原因吗 typedef struct node { int value; struct node* next; }node; int* to_array (node* ll, int size) { int i = 0; int* arr = malloc(size*sizeof(int)); while (ll) { arr[i] = ll->value; ll = ll->next;

有人能解释一下原因吗

typedef struct node {
    int value;
    struct node* next;
}node;

int* to_array (node* ll, int size) {
    int i = 0;
    int* arr = malloc(size*sizeof(int));
    while (ll) {
          arr[i] = ll->value;
          ll = ll->next;
          i++;
    }

return arr;
}

会给我们一个数组吗?我认为,当我们有指针时,我们不能像
arr[I]=5
之类单独更改它

你的问题其实是个很好的问题。当然,这个问题已经被问过很多次了。但这仍然是一个好问题

从C/C++常见问题解答:

数组不是指针,尽管它们密切相关(参见问题 6.3)并且可以类似地使用(见问题4.1、6.8、6.10和6.14)

  • 当您声明一个数组时(例如,
    inta[5]
    ),您已经为五个“int”元素分配了存储空间。您可以访问每个元素,如
    a[i]

  • 声明指针(例如
    int*b
    )时,未分配任何存储

  • 您可以同时声明和初始化指针:

    int* arr = malloc(size);
    
  • 当您声明array
    a
    时,您从堆栈中分配了空间。无法更改分配

    当您声明
    b
    时,您分配了相同数量的空间,但您是从堆中分配的。此外,您可以随时更改
    b
    以指向任何其他内容。您还可以
    realloc()
    更改内存大小

  • 正如您可以使用索引语法
    a[i]
    ,您也可以使用完全相同的语法
    b[i]

  • 此链接可能有助于解释:

    附言: 当你“有指针”时,你可以“像
    arr[i]=5
    或其他什么那样单独改变它”

    int*arr=malloc(size*sizeof(int))
    不提供数组,它提供足够大的内存块来容纳
    大小
    整数

    arr[i]=ll->value
    语句使用指针算法:表达式
    arr+5
    意味着获取由
    arr
    指向的整数的内存地址,并从那里移动5个位置。现在,由于编译器知道它正在使用
    int
    指针,并且假设是32位
    int
    s,它将知道向
    arr
    的值添加20(=5*4字节)以查找第6个元素

    接下来,C语言具有语法糖,其中表达式
    arr[5]
    相当于
    *(arr+5)

    这也是为什么C中的数组从0索引,以及为什么C数组的名称也可以用作指向数组第一个元素的指针。

    在本语句中

    int *b = NULL;  /* Initialize to 0 */
    ... OR ...
    int *b = malloc (5 * sizeof (int)); /* Allocate storage for 5 "int" elements */
    
    函数malloc分配能够存储
    size
    类型
    int
    的对象的内存范围,并返回指向该范围(或指向可容纳int类型对象的范围中的第一个插槽)的指针由于声明标识符
    arr
    左侧有type
    int*
    ,因此具有隐式转换为type
    int*
    的类型
    void*

    根据C标准(6.5.2.1阵列订阅)

    2…下标运算符[]的定义是E1[E2]为 与(*(E1)+(E2))相同。因为转换规则 如果E1是数组对象,则应用于二进制+运算符 (相当于指向数组对象初始元素的指针) E2是整数,E1[E2]指定E1的第E2个元素 (从零开始计数)

    所以这个表达

    int* arr = malloc(size*sizeof(int));
    
    int array[size];
    
    被评估为

    arr[i]
    
    子表达式中的哪个位置

    *( arr + i )
    
    使用指针算法,该表达式指向分配内存范围内的第i个元素

    如果您声明了一个数组,例如

    arr + i 
    
    那么在这个表达式中

    int* arr = malloc(size*sizeof(int));
    
    int array[size];
    
    数组名隐式转换为指向其第一个元素的指针。你可以想象它是这样的

    array[i]
    
    因此,如果您有以下声明

    int *p = array;
    *( p + i )
    
    那么下面的语句是等价的

    int array[size];
    int *p;
    

    因为操作
    array+i
    是可交换的,所以可以互换地写入

    p = array;
    
    *( p + 1 ) = 10;
    

    例如,在函数中,您可以编写

    i[array]
    
    虽然这只会让读者感到困惑。:)

    初学者总是想知道什么时候会看到这样的代码

    i[arr] = ll->value;
    

    非常感谢。谢谢你的详细解释!我现在明白了,我的荣幸。谢谢:)谢谢!我现在明白了!
    int a[10];
    
    0[a] = 5;