区分C中的各种声明

时间:2019-03-16 10:35:31

标签: c pointers variable-declaration function-declaration

我在研究问题时,发现了以下问题:

1) int*p;
2) int p(char*a)
3) int(*p(char*a))
4) int *p(void)
5) int*(*p[10])(char a)

(如果我对此处的答案有误,请纠正我。)

Q.1。在声明一个整数指针变量“ p”

Q.2。正在声明一个函数p,其字符指针变量为'a'。

第4章。正在声明一个空指针(也许)。

有人可以回答这些陈述的意思吗(如果我错了,请更正我的回答)。  请回答尽可能简单。我是编程新手。

4 个答案:

答案 0 :(得分:2)

Q.1。正确。

Q.2。您忘了提到函数在调用时会返回一个整数,因此,在程序主体中,该函数可以编写一个p(a) + 1之类的整数表达式,但否则是正确的。

第4章。这是一个棘手的问题。这里有一个p()函数,可以不带任何参数调用,但是返回一个指向整数的指针。或者,如果您想换一种说法,它返回整数的地址。在程序的主体中,例如,可以将其用作*p() + 1

你还好。读取此类声明的常用方法是

  • 向右远离标识符p,然后,在所有修饰符用尽后,向右
  • 向左远离标识符p

像这样:8765p1234。

例外情况是,如果在标识符周围加上括号 ,在这种情况下:87(43p12)56。

最后一个技巧很棘手,因为存在一些表达式,其中省略了标识符本身,因此您必须像87(4312)56这样阅读它。

答案 1 :(得分:2)

也:

Q3 int(*p(char*a));类似于int* p(char*a);,并声明一个函数,该函数获取char*并返回int*


Q5 int*(*p[10])(char a);定义了一个由10个指针组成的数组,该数组用于获取charreturning an int *`

的函数

示例:

int * g(char dummy)
{
  return NULL;
}

int*(*p[10])(char a) = { g }; /* entries 1..9 initialized to NULL */

答案 2 :(得分:2)

C声明写在boustrophedonically manner中。

它总是从右开始。

前四个声明很简单,我只写最后一个

int*(*p[10])(char a)

从变量符号开始,然后从右到左,从右到左,依次类推。始终从正确的方向开始。

  

(右)p是指向10(左)个指针的数组

...(*p[10])...
  

(右)函数,它们使用类型为char的单个参数并返回

...(...)(char a)
  

(右)指向(左)int的指针

int*(...)...

所以p is an array of 10 pointers to functions that take a single parameter of type char and return pointer to int

答案 3 :(得分:2)

基本规则:

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