区分C中的各种声明
Differentiating various declarations in C
当我回答我的问题时,我发现了这些问题:
1) int*p;
2) int p(char*a)
3) int(*p(char*a))
4) int *p(void)
5) int*(*p[10])(char a)
(如果我的回答有误,请指正。)
问题 1。正在声明一个整型指针变量 'p'
Q.2。正在声明一个函数 p,其参数为字符指针变量 'a'。
Q.4。正在声明一个空指针(可能)。
有人可以回答这些陈述的含义吗(如果我错了,请更正我的回答)。
请尽可能简单地回答。我对编程很陌生。
问题 1。正确。
Q.2。您忘记提到该函数在被调用时 returns 是一个整数——因此,在程序的主体中,可以编写一个像 p(a) + 1
这样的整数表达式——但是,否则,是正确的。
Q.4。这个很棘手。这里有一个函数 p()
可以不带参数调用,但是 returns 是一个指向整数的指针;或者,如果您更愿意换一种说法,即 returns 整数的地址。在程序的主体中,例如可以将其用作 *p() + 1
.
你很好。阅读此类声明的通常方法是
- 向右远离标识符
p
向外,然后,一旦所有修饰符都向右用尽,
- 向左远离标识符
p
向外。
像这样:8765p1234.
例外情况是标识符周围的括号介入,在这种情况下:87(43p12)56。
最后一个有点棘手,因为有些表达式省略了标识符本身,所以你必须像 87(4312)56 一样阅读它。
还有:
Q3 int(*p(char*a));
类似于 int* p(char*a);
并声明一个函数获取 char*
并返回 int*
Q5 int*(*p[10])(char a);
定义了一个包含 10 个指针的数组,指向函数获取 char
和 returning an
int*`
示例:
int * g(char dummy)
{
return NULL;
}
int*(*p[10])(char a) = { g }; /* entries 1..9 initialized to NULL */
C 声明写在 boustrophedonically manner.
总是从右边开始。
前4个声明很简单,我只写最后一个
int*(*p[10])(char a)
你从变量符号开始,然后右-左-右-左等等。始终以正确的方向开始。
(right) p
is an array of 10 (left) pointers to
...(*p[10])...
(right) functions that take a single parameter of type char
and return
...(...)(char a)
(right) pointer to (left) int
int*(...)...
所以,p is an array of 10 pointers to functions that take a single parameter of type char and return pointer to int
基本规则:
T *p; // p is a pointer to T
T *p[N]; // p is an array of pointer to T
T (*p)[N]; // p is a pointer to an array of T
T *p(); // p is a function returning a pointer to T
T (*p)(); // p is a pointer to a function returning T
T const *p; // p is a non-const pointer to const T
const T *p: // same as above
T * const p; // p is a const pointer to a non-const T
声明符可能会变得非常复杂 - 这个列表只是表面的内容。
可以通过替换构造任意复杂的声明符:
T *p; // p is a pointer to T
|
+—————+
| |
v v
T *(*a)[N]; // a is a pointer to an array of pointer to T
|
+————+
| |
v v
T *(*f(int))[N]; // f is a function returning a pointer to an array of pointer to T
|
+—————+
| |
v v
T *(*(*g[M])(int))[N]; // g is an array of pointers to functions returning pointers to arrays of pointer to T
C 标准库中的 signal
函数可能具有您可能在野外看到的最令人讨厌的声明:
void (*signal(int sig, void (*func)(int)))(int);
读作
signal — signal
signal( ) — is a function taking
signal( sig ) — parameter sig
signal(int sig ) — is an int
signal(int sig, func ) — parameter func
signal(int sig, *func ) — is a pointer to
signal(int sig, (*func)( )) — a function taking
signal(int sig, (*func)( )) — unnamed parameter
signal(int sig, (*func)(int)) — is an int
signal(int sig, void (*func)(int)) — returning void
*signal(int sig, void (*func)(int)) — returning a pointer to
(*signal(int sig, void (*func)(int)))( ) — a function taking
(*signal(int sig, void (*func)(int)))( ) — unnamed parameter
(*signal(int sig, void (*func)(int)))(int) — is an int
void (*signal(int sig, void (*func)(int)))(int) — returning void
当我回答我的问题时,我发现了这些问题:
1) int*p;
2) int p(char*a)
3) int(*p(char*a))
4) int *p(void)
5) int*(*p[10])(char a)
(如果我的回答有误,请指正。)
问题 1。正在声明一个整型指针变量 'p'
Q.2。正在声明一个函数 p,其参数为字符指针变量 'a'。
Q.4。正在声明一个空指针(可能)。
有人可以回答这些陈述的含义吗(如果我错了,请更正我的回答)。 请尽可能简单地回答。我对编程很陌生。
问题 1。正确。
Q.2。您忘记提到该函数在被调用时 returns 是一个整数——因此,在程序的主体中,可以编写一个像 p(a) + 1
这样的整数表达式——但是,否则,是正确的。
Q.4。这个很棘手。这里有一个函数 p()
可以不带参数调用,但是 returns 是一个指向整数的指针;或者,如果您更愿意换一种说法,即 returns 整数的地址。在程序的主体中,例如可以将其用作 *p() + 1
.
你很好。阅读此类声明的通常方法是
- 向右远离标识符
p
向外,然后,一旦所有修饰符都向右用尽, - 向左远离标识符
p
向外。
像这样:8765p1234.
例外情况是标识符周围的括号介入,在这种情况下:87(43p12)56。
最后一个有点棘手,因为有些表达式省略了标识符本身,所以你必须像 87(4312)56 一样阅读它。
还有:
Q3 int(*p(char*a));
类似于 int* p(char*a);
并声明一个函数获取 char*
并返回 int*
Q5 int*(*p[10])(char a);
定义了一个包含 10 个指针的数组,指向函数获取 char
和 returning an
int*`
示例:
int * g(char dummy)
{
return NULL;
}
int*(*p[10])(char a) = { g }; /* entries 1..9 initialized to NULL */
C 声明写在 boustrophedonically manner.
总是从右边开始。
前4个声明很简单,我只写最后一个
int*(*p[10])(char a)
你从变量符号开始,然后右-左-右-左等等。始终以正确的方向开始。
(right)
p
is an array of 10 (left) pointers to
...(*p[10])...
(right) functions that take a single parameter of type
char
and return
...(...)(char a)
(right) pointer to (left)
int
int*(...)...
所以,p is an array of 10 pointers to functions that take a single parameter of type char and return pointer to int
基本规则:
T *p; // p is a pointer to T
T *p[N]; // p is an array of pointer to T
T (*p)[N]; // p is a pointer to an array of T
T *p(); // p is a function returning a pointer to T
T (*p)(); // p is a pointer to a function returning T
T const *p; // p is a non-const pointer to const T
const T *p: // same as above
T * const p; // p is a const pointer to a non-const T
声明符可能会变得非常复杂 - 这个列表只是表面的内容。
可以通过替换构造任意复杂的声明符:
T *p; // p is a pointer to T
|
+—————+
| |
v v
T *(*a)[N]; // a is a pointer to an array of pointer to T
|
+————+
| |
v v
T *(*f(int))[N]; // f is a function returning a pointer to an array of pointer to T
|
+—————+
| |
v v
T *(*(*g[M])(int))[N]; // g is an array of pointers to functions returning pointers to arrays of pointer to T
C 标准库中的 signal
函数可能具有您可能在野外看到的最令人讨厌的声明:
void (*signal(int sig, void (*func)(int)))(int);
读作
signal — signal
signal( ) — is a function taking
signal( sig ) — parameter sig
signal(int sig ) — is an int
signal(int sig, func ) — parameter func
signal(int sig, *func ) — is a pointer to
signal(int sig, (*func)( )) — a function taking
signal(int sig, (*func)( )) — unnamed parameter
signal(int sig, (*func)(int)) — is an int
signal(int sig, void (*func)(int)) — returning void
*signal(int sig, void (*func)(int)) — returning a pointer to
(*signal(int sig, void (*func)(int)))( ) — a function taking
(*signal(int sig, void (*func)(int)))( ) — unnamed parameter
(*signal(int sig, void (*func)(int)))(int) — is an int
void (*signal(int sig, void (*func)(int)))(int) — returning void