区分C中的各种声明

问题描述 投票:1回答:4

在我查看问题时,我发现了以下问题:

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。使用char指针变量'a'作为参数声明一个函数p。

Q.4。声明一个无效指针(可能)。

有人可以回答这些陈述的含义(如果我错了,也要纠正我的答案)。请尽可能简单地回答。我对编程很陌生。

c pointers variable-declaration function-declaration
4个回答
2
投票

问题1。正确。

Q.2。你忘了提到函数,当被调用时,返回一个整数 - 所以,在程序的主体中,可以写一个像p(a) + 1这样的整数表达式 - 但是,否则,正确。

Q.4。这个很棘手。这里有一个函数p(),可以不带参数调用,但返回指向整数的指针;或者,如果你更喜欢用另一种方式说,它返回一个整数的地址。在程序的主体中,可以使用它作为*p() + 1

你做的不错。阅读此类声明的通常方法是

  • 向右远离标识符p向外,然后,一旦所有修饰符都已用尽,
  • 向左远离标识符p向外。

像这样:8765p1234。

唯一的例外是标识符周围的括号是否介入,在这种情况下:87(43p12)56。

最后一个变得棘手,因为存在一些表达式,其中标识符本身被省略,所以你必须像87(4312)56那样阅读它。


2
投票

另外:

Q3 int(*p(char*a));就像int* p(char*a);并声明一个函数获得char*并返回int*


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

示例:

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

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

2
投票

C声明用boustrophedonically manner编写。

它一直从正确开始。

4个第一个声明很容易,我只写了最后一个

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


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
© www.soinside.com 2019 - 2024. All rights reserved.