首页 > 编程知识 正文

c语言定义和声明的区别,c语言程序

时间:2023-05-04 11:02:25 阅读:12580 作者:3096

char*const*(*next ) ); 里面的next是什么?

1 .声明和定义c语言中的对象必须只有一个定义,并且必须具有多个extern 声明。 (这里所说的对象与c中的对象无关。 这里的对象只是与链接器相关的“对象”,如函数和变量。)

定义是一个特殊的声明,它创建对象。

声明简要说明了在其他位置创建的对象的名称,并允许使用该名称。

角色的出现次数定义只能在一个位置用于确定对象类型并分配内存以创建新对象。 示例: int my_array[100]; 声明可能会多次出现描述对象的类型,这些描述对象指向在其他位置定义的对象(例如,在其他文件中)。 示例: extern int my_array[]; 声明相当于一般声明,它说明在其他地方创建的对象,而不是自己。 extern对象声明告诉您编译器对象的类型和名称,对象的内存分配发生在其他位置。 (声明没有为数组分配内存,因此不需要提供有关数组长度的信息。 )

定义相当于特别声明,对象为分配内存

2 .指针常量和常量指针2.1 .关键字const c语言有关键字const。 假设您定义了只读变量(常量变量),并创建了以下函数片段:

常数Int a=10; a=11; 编译器警告“表达式必须是可更改的左侧值”。 这意味着无法放置在应该包含常数的地址中的值,即赋值符号=的左侧

2.2. const指针以上示例说明了const如何限定int类型,但以下写作方法均相同

常数Int a=10; int const a=10; 但是,将const与指针一起使用时,情况会有所不同,如下所示

int z=10; int a=10; 常数int * pa=a; int b=10; int const * pb=b; int c=10; int* const pc=c; *pa=1; //error*pb=1; //error*pc=1; //rightpa=z; //rightpb=z; //rightpc=z; //error上的片段列出了三个声明:

常数int * p;

int const *p;

int *const p;

其中前两个不能更改指针p指向的地址中的值。 也就是说,const限定*p,不能更改最后一个指针p的值。 也就是说,const修饰指针p。 p是指针常数。

当然,指针也可以是常量。 指针指向的也是常数,也就是常数指针常数:

常数int *常数p;

int const * const p;

你可能知道了const的修饰规则,所以继续读

3 .奇怪的c语言设计哲学客体的声明形式与其使用形式尽量相似

这是c语言受到前辈的棒后,支持二进制以外的其他数据类型(例如int )时产生的设计哲学

例如,定义指向int类型变量a的指针时使用表达式p(int*p=a ),使用时也使用指针) p=1)指向的int数据,如p所示。 这样使定义(宣言)与使用一致,但像我们这样从左向右读的人,很难推测例如int *p[3]是int型的指针数组,还是指向int数组的指针。

“宣言的形式和使用的形式相似”在当时也不是特别好的想法。 把两个完全不同的东西放在一起真的有什么重要意义吗? 贝尔研究所的研究人员也承认这一批评是正当的,但他们坚决承担起原来的决定,至今仍在继续。 声明指针的好方法如下。

int p; 至少p可以指示它是整数地址。 此语法目前在c中采用,用于表示参数的地址调用。

3.1 .宣言的优先规则c理解语言宣言的优先规则

声明从其名称开始读取,按优先顺序依次读取。 按照优先顺序从高到低的顺序如下。

2.1 .声明中括在括号内的部分。

2.2 .后缀运算符:括号(表示是函数,方括号)表示是数组

2.3 .前缀运算符:星号*表示"指向……的指针"。 如果const和/或volatile关键字紧跟在类型说明符(如int和long )之后,则会影响类型说明符。 否则,const和/或volatile关键字会影响左侧相邻指针的星号。 例如,以上规则中文章开头的char*const*(*next ) );

为了应用规则解释1,首先,我们看到变量名next,发现它直接放在括号中,所以我们把括号中的东西放在一起,作为“next是指向……的指针”2,考虑到括号外部的内容,我们把星号前缀和括号后缀放在一起

则告诉我们优先级较高的是右边的函数括号,所以得出“next 是一个函数指针,指向一个返回……的函数”2.3再次,处理前缀“*”,得出指针所指的内容3最后,把 char * const 解释为指向字符的常量指针

所以一通解释完,可以知道这个声明表示“next 是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为 char 的常量指针”

3.2. 图表分析声明:

当然这儿也有直观的图表解码声明(解密式编程)

一开始,我们从左边开始向右寻找,直到找到第一个标识符。当声明中的某个符号与图中所示匹配时,便把它从声明中处理掉,以后不再考虑。在具体的每一步骤上,我们首先查看右边的符号,然后再看左边。当所有的符号都被处理完毕后,便宣告大功告成

比如还是分析上面的char * const *(*next)();:

剩余的声明(从最左边的标识符开始)所采取的下一步骤结 果char * const *(*next) ( );第 1 步表示“next 是……”char * const *(* ) ( );第 2、3 步不匹配,转到下一步,表示“next 是……”char * const *(* ) ( );第 4 步不匹配,转到下一步char * const *(* ) ( );第 5 步与星号匹配,表示“指向……的指针”,转第 4 步char * const *( ) ( );第 4 步“(”和“)”匹配,转到第 2 步char * const * ( );第 2 步不匹配,转到下一步char * const * ( );第 3 步表示“返回……的函数”char * const * ;第 4 步不匹配,转到下一步char * const * ;第 5 步表示“指向……的指针”char * const ;第 5 步表示“只读的……”char * ;第 5 步表示“指向……的指针”char ;第 6 步表示“char”

拼在一起,读作:
“next 是一个指向函数的指针,该函数返回另一个指针,该指针指向一个只读的指向 char的指针”

看懂了的话可以试试char *(* c[10])(int **p);

4. 参考与引用: 《C专家编程》第三、四章
书籍pdf可以来我的博客寻找

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。