指向结构的双指针
Double pointer to struct
我在intel网站上看到过这个程序,但是有些台词看不懂。如果您不能理解该程序,如果您建议一些 material 来分析此类程序,我将不胜感激。
该程序是用C语言编写的,声明了两个名为Coefficients
和Roots
的结构,然后用0
实例化了指向它们的双指针。如果 Coef_set
和 Root_set
是双指针,为什么它们指向相同的数字零?
程序使用malloc
的方式也很奇怪,因为它使用指向结构的双指针进行类型转换(我这里的意思是:Coef_set = (struct Coefficients **)
)和指向[=中的结构的指针18=] 函数。 (我的意思是:sizeof(struct Coefficients *)
)。然后在for
循环中给a
、b
、c
、x1
和x2
的参数赋值为零,在接下来 for
循环给他们其他数字。为什么它分配了两次数字?
// Quadratic Equation: a*x^2 + b*x + c = 0
struct Coefficients {
float a;
float b;
float c;
} coefficients;
struct Roots {
float x1;
float x2;
} roots;
struct Coefficients ** Coef_set=0;
struct Roots ** Root_set=0;
Coef_set = (struct Coefficients **) malloc(N * sizeof(struct Coefficients *));
Root_set = (struct Roots **) malloc(N * sizeof(struct Roots *));
for (i=0; i<N; i++)
{
Coef_set[i] = (struct Coefficients *) malloc(sizeof(struct Coefficients));
Coef_set[i]->a = 0;
Coef_set[i]->b = 0;
Coef_set[i]->c = 0;
Root_set[i] = (struct Roots *) malloc(sizeof(struct Roots));
Root_set[i]->x1 = 0;
Root_set[i]->x2 = 0;
}
// Initialize the arrays
for (i=0; i<N; i++)
{
Coef_set[i]->a = (float)(i % 64) + 1.0;
Coef_set[i]->b = (float)(i % 64) + 101.0;
Coef_set[i]->c = (float)(i % 32) - 33.0;
Root_set[i]->x1 = 0;
Root_set[i]->x2 = 0;
}
行 struct Coefficients ** Coef_set=0;
和 struct Roots ** Root_set=0;
没有设置指针“指向相同的数字零”。当用于给指针赋值时,常量 0
用作空指针。每个指针都设置为一个值,称为空指针,表示它不指向任何对象。
下面的语句,Coef_set = (struct Coefficients **) malloc(N * sizeof(struct Coefficients *));
和 Root_set = (struct Roots **) malloc(N * sizeof(struct Roots *));
,每个都分配内存并设置其中一个指针指向该内存。因为如果这样,指向空指针的指针的初始化就没有意义;该空指针值立即被指向已分配内存的指针覆盖。
整个代码可以简化为:
struct Coefficients {
float a;
float b;
float c;
};
struct Roots {
float x1;
float x2;
};
typedef struct
{
struct Coefficients coefficients;
struct Roots roots;
}equasion;
equasion *foo(size_t N)
{
equasion *equasions = calloc(N, sizeof(*equasions));
// Initialize the arrays
for (size_t i=0; i<N; i++)
{
equasions[i].coefficients.a = (float)(i % 64 + 1);
equasions[i].coefficients.b = (float)(i % 64 + 101);
equasions[i].coefficients.c = (float)(i % 32 - 33);
}
return equasions;
}
不需要双指针、指针数组和单独分配的结构。不需要归零,因为有 calloc
功能。 sizeof
中不应使用类型。请改用对象。
我在intel网站上看到过这个程序,但是有些台词看不懂。如果您不能理解该程序,如果您建议一些 material 来分析此类程序,我将不胜感激。
该程序是用C语言编写的,声明了两个名为Coefficients
和Roots
的结构,然后用0
实例化了指向它们的双指针。如果 Coef_set
和 Root_set
是双指针,为什么它们指向相同的数字零?
程序使用malloc
的方式也很奇怪,因为它使用指向结构的双指针进行类型转换(我这里的意思是:Coef_set = (struct Coefficients **)
)和指向[=中的结构的指针18=] 函数。 (我的意思是:sizeof(struct Coefficients *)
)。然后在for
循环中给a
、b
、c
、x1
和x2
的参数赋值为零,在接下来 for
循环给他们其他数字。为什么它分配了两次数字?
// Quadratic Equation: a*x^2 + b*x + c = 0
struct Coefficients {
float a;
float b;
float c;
} coefficients;
struct Roots {
float x1;
float x2;
} roots;
struct Coefficients ** Coef_set=0;
struct Roots ** Root_set=0;
Coef_set = (struct Coefficients **) malloc(N * sizeof(struct Coefficients *));
Root_set = (struct Roots **) malloc(N * sizeof(struct Roots *));
for (i=0; i<N; i++)
{
Coef_set[i] = (struct Coefficients *) malloc(sizeof(struct Coefficients));
Coef_set[i]->a = 0;
Coef_set[i]->b = 0;
Coef_set[i]->c = 0;
Root_set[i] = (struct Roots *) malloc(sizeof(struct Roots));
Root_set[i]->x1 = 0;
Root_set[i]->x2 = 0;
}
// Initialize the arrays
for (i=0; i<N; i++)
{
Coef_set[i]->a = (float)(i % 64) + 1.0;
Coef_set[i]->b = (float)(i % 64) + 101.0;
Coef_set[i]->c = (float)(i % 32) - 33.0;
Root_set[i]->x1 = 0;
Root_set[i]->x2 = 0;
}
行 struct Coefficients ** Coef_set=0;
和 struct Roots ** Root_set=0;
没有设置指针“指向相同的数字零”。当用于给指针赋值时,常量 0
用作空指针。每个指针都设置为一个值,称为空指针,表示它不指向任何对象。
下面的语句,Coef_set = (struct Coefficients **) malloc(N * sizeof(struct Coefficients *));
和 Root_set = (struct Roots **) malloc(N * sizeof(struct Roots *));
,每个都分配内存并设置其中一个指针指向该内存。因为如果这样,指向空指针的指针的初始化就没有意义;该空指针值立即被指向已分配内存的指针覆盖。
整个代码可以简化为:
struct Coefficients {
float a;
float b;
float c;
};
struct Roots {
float x1;
float x2;
};
typedef struct
{
struct Coefficients coefficients;
struct Roots roots;
}equasion;
equasion *foo(size_t N)
{
equasion *equasions = calloc(N, sizeof(*equasions));
// Initialize the arrays
for (size_t i=0; i<N; i++)
{
equasions[i].coefficients.a = (float)(i % 64 + 1);
equasions[i].coefficients.b = (float)(i % 64 + 101);
equasions[i].coefficients.c = (float)(i % 32 - 33);
}
return equasions;
}
不需要双指针、指针数组和单独分配的结构。不需要归零,因为有 calloc
功能。 sizeof
中不应使用类型。请改用对象。