任何人都可以帮我理解这个程序中的typedef吗?

时间:2014-06-23 06:30:01

标签: c typedef

它只是一个简单的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; ????
}
显而易见,我错过了一些错误的解释。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:7)

您将typedef#define混淆。预处理器#define是简单文本替换的那个。

另一方面,

typedef不是预处理器的一部分,但在语法上类似于关键字externstatic等。它为某种类型提供了新名称。

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作为整数的前缀意味着,而不是声明变量,而是声明新的类型名称。然后可以将这些新类型名称用作新类型变量声明的前缀。