Typedef与数组在C中

问题描述:

你好,我是C编程新手。在长时间使用python之后,C似乎变得更加困难(而且无限多的乐趣)!Typedef与数组在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阵列是0​​的数组还是[5][10]的数组?

如果使用

second_t v; 

这是完全一样的

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_t已经假定单个元素本身就是一维数组)。说初始化意味着你用一些数据填充内存。在这种情况下,你可以说memset(my_vec, 0, sizeof(my_vec));来清零数组。如果你有一个更简单的变量,比如说,int a;,那么你可以用初始化它与a = 1;

如果声明vector_t another_example[10][10],这实际上给你一个3维数组 - 10×10×10

如果我使用second_t会发生什么? 2d阵列是Array [10] [5]还是Array [5] [10]?

所以,你可以从我的文章的开头了解,在后一种情况下,既没有宣布second_t Array[10][5]也不second_t Array[5][10]会给出一个二维数组。 实际上,这将是维数组,因为second_t将单个元素定义为已经是二维数组。

教育目的,我建议你干脆的东西,以便能够构建更复杂的类型,然后声明数组(比如,变量将被称为array),最后开始喜欢

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

typedef uint8_t vector_t[10]; 

,请执行类似printf("The size is %lu bytes\n", sizeof(array));的操作,以查看以字节为单位的总大小。然后很容易看到总大小考虑到基本类型是uint8_t(1字节)。