它只是一个简单的C程序,我不明白这一点是:当我们写的时候
typedef int RowArray[COLS];
我认为typedef的工作方式是从typedef直到最后一个单词被&#34 ;;"之前的最后一个单词替换的所有内容。所以在这里必须有类似typedef int RowArray [COLS] X;那么X * rptr;
但在这里我无法理解。如果可能的话,你可以给我发一个关于typedef上某些材料的链接,在这种情况下会解释这种情况。
#include <stdio.h>
#include <stdlib.h>
#define COLS 5
typedef int RowArray[COLS]; // use of typedef
RowArray *rptr; // here dont we have to do RowArray[COLS] *rptr;
int main()
{
int nrows = 10;
int row, col;
rptr = malloc(nrows * COLS * sizeof(int));
for(row=0; row < nrows; row++)
{
for(col=0; col < COLS; col++)
{
rptr[row][col] = 17;
}
}
for(row=0; row<nrows; row++)
{
for(col=0; col<COLS; col++)
{
printf("%d ", rptr[row][col]);
}
printf("\n");
}
return 0;
}
explanation of typedef 从上面的链接我理解我在问题中发布的示例代码中的typedef的工作。但是在链接中进一步阅读它会显示另一个typedef的例子。
//To re-use a name already declared as a typedef, its declaration must include at least one type specifier, which removes any ambiguity:
typedef int new_thing;
func(new_thing x){
float new_thing;
new_thing = x;
}
现在,如果有人能解释这里发生的事情,那会让我更加困惑。 如在第一行
typedef int new_thing;
func(new_thing x) //here i assume it works as (int x) as we did typedef int new_thing earlier.
但是当大括号开始时
{
float new_thing; //so what happens here exactly (float int;) ???
new_thing = x; // and here too int = x; ????
}
显而易见,我错过了一些错误的解释。
谢谢你的帮助。
答案 0 :(得分:7)
您将typedef
与#define
混淆。预处理器#define
是简单文本替换的那个。
typedef
不是预处理器的一部分,但在语法上类似于关键字extern
,static
等。它为某种类型提供了新名称。
typedef int RowArray[COLS];
RowArray
定义了一种int
数组,其中包含COLS
个元素。所以
RowArray *rptr;
rptr
是指向int
数组COLS
元素的指针。
答案 1 :(得分:3)
虽然typedef被认为是一个存储类,但事实并非如此。它允许您为可能以其他方式声明的类型引入同义词。新名称将等同于您想要的类型,如此示例所示。
typedef int aaa, bbb, ccc;
typedef int ar[15], arr[9][6];
typedef char c, *cp, carr[100];
/* now declare some objects */
/* all ints */
aaa int1;
bbb int2;
ccc int3;
ar yyy; /* array of 15 ints */
arr xxx; /* 9*6 array of int */
c ch; /* a char */
cp pnt; /* pointer to char */
carr chry; /* array of 100 char */
使用typedef的一般规则是写出一个声明,就像声明所需类型的变量一样。如果声明引入了具有特定类型的名称,则使用typedef作为整数的前缀意味着,而不是声明变量,而是声明新的类型名称。然后可以将这些新类型名称用作新类型变量声明的前缀。