您好我是C编程的新手。在使用python很长一段时间之后,C似乎变得无比艰难(并且无限更有趣)!
我无法解决的问题是使用typedef
数组,特别是2D数组。
typedef double vector_t[10];
据我了解,这有助于我们使用vector_t
初始化一个包含10个元素的double
数组。那么初始化vector_t[10]
会初始化一个[10][10]
数组吗?
如果我初始化vector_t[5]
?
typedef vector_t second_t[5];
如果我使用second_t
会怎样? 2d数组是[10][5]
的数组还是[5][10]
的数组?
答案 0 :(得分:4)
如果您使用
second_t v;
这与
完全相同vector_t v[5];
这与
完全相同double v[5][10]; /* NOT double[10][5] */
当你展开typedef
时,想象一下你在typedef
的{{1}}名称中替换了typedef
名称中的任何内容:
typedef something t[size];
t x;
/* subst [t := x] into the typedef definition */
something x[size];
second_t v;
/* [second_t := v] in definition */
vector_t v[5];
/* [vector_t := v[5]] in definition */
double v[5][10];
typedef int (*unary_op)(int); /* pointers to functions int => int */
typedef int (*consumer)(unary_op); /* pointers to functions (int => int) => int */
consumer f;
/* [consumer := f] in definition */
int (*f)(unary_op);
/* [unary_op := ] (replace unary_op with "", because there's no name) in definition.
We must respect parentheses */
int (*f)(int (*)(int));
// Something like int func(unary_op op) { return op(5); }
答案 1 :(得分:0)
据我所知,这有助于我们使用vector_t初始化一个包含10个元素的双精度数组。
这不太正确。确切地说,此typedef定义了一个自定义类型,使其能够声明一个数组,比如vector_t example[N];
,真正的维度将是N + 1
(自vector_t
以来已经假定单个元素本身就是一维数组。说初始化意味着你用一些数据填充该内存。在这种特殊情况下,您可以说memset(my_vec, 0, sizeof(my_vec));
将数组归零。如果您有一个更简单的变量,比如int a;
,那么您可以初始化,例如a = 1;
。
如果您声明vector_t another_example[10][10]
,这实际上会为您提供一个三维数组 - 10 x 10 x 10.
如果我使用second_t会发生什么? 2d数组是Array [10] [5]还是Array [5] [10] ??
因此,正如您在帖子开头所理解的那样,在后一种情况下,声明second_t Array[10][5]
和second_t Array[5][10]
都不会给出2D数组。
实际上,这将是 4 - 维数组,因为second_t
将单个元素定义为已经是2D数组。
出于教育目的,我建议您先从
开始#include <stdio.h>
#include <stdint.h>
typedef uint8_t vector_t[10];
为了能够构造更复杂的类型,然后声明数组(比如,变量将被称为array
),最后,执行类似printf("The size is %lu bytes\n", sizeof(array));
的操作以查看总大小以字节为单位然后很容易看出总大小考虑到基本类型是uint8_t
(1个字节)。