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);
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
左侧有typeint*
,因此具有隐式转换为typeint*
的类型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;