预处理和typedef

1.typedef 和#define

首先,#define是预处理,语句后面不需要分号

其次,注意下面两个区别

?
#define string_d char *
  
typedef char * string_t;
  
string_d s1,s2;
  
string_t s3,s4;

  s1,s3,s4都被声明为char *,而s2被声明为char。

所以用于处理指针时,最好使用typedef。
2.

?
typedef struct 
{
      char *item;
      NODEPTR next;
}*NODEPTR;

  但是编译器报告了错误信息,难道在c语言中结构不能包含指向自己的指针吗?

c语言中结构当然能包括指向自己的指针,这个问题在于typedef。不能在定义typedef前使用它,在上面的例子中,在next域声明的地方还没有定义NODEPTR。要解决这个问题。首先赋予这个结构一个标签(“struct node"),然后声明next域为("struct node *"),或者分开typedef声明还结构定义,或者两者都采纳,以下是修正后的一个版本。

?
typedef struct node{
     char *item;
     struct node * next;
}*NODEPTR;

  也可以在声明结构之前先用typedef,然后就可以在声明中使用类型定义NODEPTR了,下面这种情况在struct node 还没有完全定义的情况下就使用它来声明一个新的typedef

,这是允许的。

?
struct node; //在使用前先声明
typedef struct node *NODEPTR;
struct node{
     char *item;
     NODEPTR next;
}; //这个可以叫做定义

  最后这是一种两种情况都采用的方法。

?
struct node{
     char *item;
     struct node * next;
};                                     //从这里也可以看出,定义结构时,结构变量可以是指向自己的指针
typedef struct node * NODEPTR;

  3.注意以下两种区分

?
typedef struct {
     int i;
}simplestruct;
struct {
     int i;
}simplestruct;
这两种都没有结构标签,第一种只不过声明了一个typedef类型。第二种定义了一个结构变量。
第一种和下面的这个其实一样
struct simplestruct{
             int i;
 } 
对第一个simplestruct.i=10;是错误的
对第二个simplestruct.i=10;是正确的

 4.

?
typedef int  (*funcptr) ();

  这个是什么意思?它定义了一个类型funcptr,表示指向返回值为int的函数的指针。它可以用来声明一个或多个函数指针

funcptr fp1,fp2;

这个声明等价于以下的写法

int (*fp1) ( ), (*fp2) ( );

?
typedef int Long_int[3];

   Long_int a;

 相当于int a[3];

?
typedef int arr[5];
typedef arr Array[10];

Array a; 

相当于int a[10][5];

你可能感兴趣的:(C/Linux,C)