C中带有数组的Typedef

C中带有数组的Typedef,c,typedef,C,Typedef,你好,我是C编程新手。在使用python很长一段时间之后,C似乎变得非常困难(而且非常有趣) 我无法理解的是使用typedef数组,尤其是二维数组 typedef double vector_t[10]; 据我所知,这有助于我们使用vector\u t初始化包含10个元素的doubles数组。初始化向量[10]是否会初始化[10][10]数组 如果我初始化向量[5],又会怎么样 typedef vector_t second_t[5]; 如果我使用second\t,会发生什么?二维数组是[1

你好,我是C编程新手。在使用python很长一段时间之后,C似乎变得非常困难(而且非常有趣)

我无法理解的是使用
typedef
数组,尤其是二维数组

typedef double vector_t[10];
据我所知,这有助于我们使用
vector\u t
初始化包含10个元素的
double
s数组。初始化
向量[10]
是否会初始化
[10][10]
数组

如果我初始化向量[5],又会怎么样

typedef vector_t second_t[5];
如果我使用
second\t
,会发生什么?二维数组是
[10][5]
数组还是
[5][10]
数组

second_t v;
这和

vector_t v[5];
double v[5][10]; /* NOT double[10][5] */
这和

vector_t v[5];
double v[5][10]; /* NOT double[10][5] */
当您展开一个
typedef
时,假设您正在用
typedef
后面的任何内容替换其定义中的
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); }
据我所知,这有助于我们使用vector_t初始化一个包含10个元素的双精度数组

那不太正确。确切地说,这个typedef定义了一个自定义类型,它允许一个人声明一个数组,比如说,
vector\t example[N]
哪个真正的维度将是
N+1
(因为
vector\u t
已经假设单个元素本身就是一维数组)。说initialise意味着用一些数据填充内存。在这种特殊情况下,您可以说
memset(my_-vec,0,sizeof(my_-vec))
将阵列归零。如果你有一个更简单的变量,比如,
inta
,然后您可以使用,比如,
a=1来初始化它

如果您在另一个示例[10][10]
中声明了
vector,\n这实际上将为您提供一个三维数组-10 x 10 x 10

如果我使用second\t会发生什么?二维数组是数组[10][5]还是数组[5][10]

因此,正如您在我的文章开头所理解的,在后一种情况下,无论是声明
第二个数组[10][5]
还是
第二个数组[5][10]
都不会给出2D数组。 实际上,这将是4维数组,因为
second\t
将单个元素定义为已经是二维数组

出于教育目的,我建议您从以下内容开始

#include <stdio.h>
#include <stdint.h>

typedef uint8_t vector_t[10];
#包括
#包括
typedef uint8_t vector_t[10];
为了能够构造更复杂的类型,然后声明数组(例如,变量将被称为
array
),最后执行类似于
printf的操作(“大小为%lu字节\n”,sizeof(数组))以查看以字节为单位的总大小。然后,很容易看到考虑的总大小是多少,最基本的类型是
uint8\u t
(1字节)