首页 > 解决方案 > typedef 指针别名与定义指针别名

问题描述

当你声明一个指向 int 的指针时:

int *a, b;

a是一个指针,而是一个(我从来没有真正理解为什么会发生这种情况,我知道与逗号有关,但我曾经说过星号被绑定到变量名而不是数据类型)int。无论如何,如果你:bint

#define intptr int*
intptr a, b

结果是一样的。我觉得奇怪的事实是为什么使用typedef相同的东西会改变行为?

typdef int* intptr 
intptr a, b;

在最后一个例子中,我期望a成为一个int*while 。相反,他们都是bintint*


为了澄清,有以下代码片段我不明白为什么我没有得到相同的d变量警告

#define intptr_def int*

typedef int* intptr_typ;

int main()
{
    int x;

    intptr_def a, b;
    intptr_typ c, d;

    a = &x;
    b = &x;     // Warning assignment to 'int' from 'int *' makes integer from pointer without a cast
    c = &x;
    d = &x;

    return 0;
}

标签: ctypedef

解决方案


宏是文本替换,仅此而已。如果你有

#define intptr int*

和写

intptr a, b;

然后当代码被预处理时,intptr宏被扩展

int* a, b;

它的处理方式与

int *a, b;

并且仅声明a为指针;b是常客int

typedef 名称是类型的别名——它不像预处理器宏那样是文本替换。

typedef int *intptr;

创建intptrint *(指向int)的别名。所以当你写

intptr a, b;

两者都a具有b类型intptr( int *)。


C 中的声明具有基本结构

declaration-specifiers declarators

声明说明符包括类型说明符(int, float,char等),类型限定符(const, volatile),存储类说明符(static, auto, register)以及一些与函数声明/定义相关的其他说明符。

声明器介绍被声明事物的名称,以及有关该事物的数组、指针和函数的信息。例如,在声明中

static volatile unsigned int a[10], *p;

声明说明符是static volatile unsigned int和声明符是a[10]and *p。每个变量的类型完全由声明说明符和声明符的组合指定。的类型a是“10 元素数组static volatile unsigned int”,的类型p是“指针static volatile unsigned int”。

这个想法是声明符的结构与代码中表达式的结构相匹配。例如,假设你有一个指向intnamed的指针iptr,并且你想打印它指向的对象中的值,你会写

printf( "%d\n", *iptr );

表达式的类型*iptrint,所以声明写成

int *iptr;

你也可以写成

int* iptr;

或者

int*iptr;

甚至

int      *      iptr;

并且所有将被解释为

int (*iptr);

空格没有任何区别 -*它始终是声明符的一部分,而不是声明说明符。声明符可以变得任意复杂——对于任何声明说明符序列T,您都可以有

T x;          // x is an object of type T
T a[N];       // a is an array of T
T *p;         // p is a pointer to T
T f();        // f is a function returning T

T *a[N];      // a is an array of pointer to T
T (*p)[N];    // p is a pointer to an array of T
T *f();       // f is a function returning pointer to T
T (*p)();     // p is a pointer to a function returning T

T *(*a[N])(); // a is an array of pointers to functions
              // returning pointer to T

而这只是触及表面。


推荐阅读