c - typedef 指针别名与定义指针别名
问题描述
当你声明一个指向 int 的指针时:
int *a, b;
a
是一个指针,而是一个(我从来没有真正理解为什么会发生这种情况,我知道与逗号有关,但我曾经说过星号被绑定到变量名而不是数据类型)int
。无论如何,如果你:b
int
#define intptr int*
intptr a, b
结果是一样的。我觉得奇怪的事实是为什么使用typedef
相同的东西会改变行为?
typdef int* intptr
intptr a, b;
在最后一个例子中,我期望a
成为一个int*
while 。相反,他们都是b
int
int*
为了澄清,有以下代码片段我不明白为什么我没有得到相同的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;
}
解决方案
宏是文本替换,仅此而已。如果你有
#define intptr int*
和写
intptr a, b;
然后当代码被预处理时,intptr
宏被扩展为
int* a, b;
它的处理方式与
int *a, b;
并且仅声明a
为指针;b
是常客int
。
typedef 名称是类型的别名——它不像预处理器宏那样是文本替换。
typedef int *intptr;
创建intptr
为int *
(指向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
”。
这个想法是声明符的结构与代码中表达式的结构相匹配。例如,假设你有一个指向int
named的指针iptr
,并且你想打印它指向的对象中的值,你会写
printf( "%d\n", *iptr );
表达式的类型*iptr
是int
,所以声明写成
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
而这只是触及表面。
推荐阅读
- python-3.x - 每 24 小时后调用函数而不影响以下代码
- caching - 在 dotnet core 中使用内存中的集合 - 如何使所有类都可用
- vue.js - nuxt.js 获取数据到 vuetify 表
- arrays - 设置一次时,二维数组中的值出现两次
- google-sheets - 根据Google表格中的单元格值将行复制到另一个表格
- python - 是否可以将 numpy 数组和采样率发送到微软语音到文本而不是将其保存到 wav 文件?
- angular - 如何将数组修补到formarray
- php - 如何在 laravel 8 中使用预先存在的表进行自定义身份验证?
- mysql - MySql如何获取2个日期之间的数据,如果为空返回0
- c# - 继承到 c# 扩展方法的 Swift 扩展?