娓娓道来c指针 (4)解析c的声明语句

(4)解析c的声明语句

在继续探索c指针之前,有必要来解析下c语言中复杂的声明语法。

只需要记住两点:一个原则,一个规则。

原则:先看标示符。

规则:运算符优先级是规则。

举例说明

1.最简单的 int array[3];

结论:array是数组,数组规模是3,元素类型是int。

解析过程:先看标示符:array,只有一个运算符[],那么array就是数组,元素类型是int,完了。

2.难一点的

(1)数组指针 int(*array)[3];

结论:array是一指针,指向一数组,数组规模是3,数组中元素类型int。

解析过程:先看标示符:array,由于使用了括号运算符,只能先解析(*array):说明array是一指针。解析完了的,就可抛弃,那么只剩下[],说明指向的是一数组,剩下的不解释了。

(2)指针数组 int *array[3];

结论:array是一数组,数组规模是3,数组中元素类型是int*。

解析过程:先看标示符:array,由于[]优先级高于*,故array先与[]结合:说明array是一数组。只剩下一个*,说明数组中存放的是指针,指针指向的类型是int,也就是说数组中存放的元素类型是int*。

看来只差一个(),意义完全不同。

数组指针和指针数组的内存示意图:

3.再复杂一点的

函数指针 int (*pfun)(int,int);

结论:pfun是一函数指针,即pfun指向一个函数,该函数有两个参数,参数类型是int、int,并且函数的返回值的类型是int。

解析过程:先看标示符:pfun,由于使用了括号运算符,只能先解析(*pfun):说明pfun是一指针。现只剩下(int,int),进一步说明pfun指向的是一函数,该函数有两参数,类型都是int,最后的int,说明函数的返回值类型是int。

4.更加复杂一点

int *(*pfun[3])(int, void (*)(int, int*));

是否有眼花缭乱的感觉,运用上面的方法,你会解析出来的。不妨写在评论中,比较看看。

专栏目录:C指针

娓娓道来c指针 (4)解析c的声明语句

时间: 2024-07-29 20:24:49

娓娓道来c指针 (4)解析c的声明语句的相关文章

娓娓道来c指针 (0)c语言的梦魇:c指针

(0)c语言的梦魇:c指针 序 c语言中有一个重点:c指针.它也是一个难点.当然,这是一句废话:重点往往也是难点.在c标准中,对指针的定义是这种: 指针的类型是derived from其他类型,也就是说指针的类型是由它指向的类型决定的: 指针是一种reference类型,即引用类型: c指针似乎非常难理解,以至于有人指出:掌握了c指针,就掌握了c语言的精髓.本系列就来聊聊c指针,要想弄懂c指针.光就指针本身进行理解,还不够. 由于指针的本质就一句话:指针就是地址.这句话大多数学过c语言的人都明白

娓娓道来c指针 (8)开发可变参数函数

(8)开发可变参数函数 在c语言中,可变参数的函数极其常见,如常用的printf().可变参数函数的一般形式如下: 返回值类型 函数名(类型1 参数1,类型2 参数2,...类型n 参数n,...); 如上所示,这是一个典型的可变参数样式,它共有n个确定的参数,最后的...表示可变参数的含义.必须指出...必须位于最后,并且它至少要有一个确定的参数,原因后面陈述. 为了开发可变参数的函数,需用到头文件stdarg.h.下面共给出两个实例,在实例中详细解释用法.一是求可变个整数的和:二是模仿pri

娓娓道来c指针 (2)内存分配

(2)内存分配 c语言中描述变量的时候常用的两个用语 1.作用域:也叫可见域,指的是变量的作用范围.在哪个范围内,该变量是可见的.可以使用的. 2.生存期:也叫存储期,指的是变量从创建到销毁的生存时间段. 作用域和存在域是两个不同的概念,比如在程序的某个位置,某变量存在(内存中分配了地址)但不可见(不可使用). 作用域 从作用域看,变量分为以下三种: 1.全局变量 在c语言中,把在任何函数之外声明的变量称为全局变量.一般情况下,全局变量在任何地方都是可见的.当然也有例外,比如在语句块{}内声明了

娓娓道来c指针 (3)指针和数组

(3)指针和数组 在c中指针和数组似乎有着千丝万缕的关系.其实它们不是一回事:指针是指针,数组是数组,两者不相同. 说它们有关系,不过是因为常见这样的代码: int main() { int array[] = {1,2,3,4,5}; int n = sizeof(array) / sizeof(int); int *p = array; int i; for (i = 0; i < n; i++) printf("p[%d]...%d\n", i, p[i]); system

C指针的解析

这是我从网上转载的一篇关于C指针的文章,方便自己以后回顾,自己添加修改部分内容 ,不对请指正 Attention:指针是指针变量 ,数组是指针常量 第一章 指针的概念  指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: (1)指针的类型 (2)指针所指向的类型 (3)指针的值或者叫指针所指向的内存区 (4)指针本身所占据的内存区. 先声明几个指针放着做例子: 例一: (1) int *ptr; (2) char *ptr; (3) i

娓娓道来c指针 (5)c数组本质

(5)c数组本质 c中的数组是一种聚合类型,把同种类型的元素按顺序存储,即是数组.c中数组类型的特点在于:它是嵌套定义的. 看下一个二维数组int array[2][3]={{1,2,3},{4,5,6}};的内存存储形式: c中的数组是嵌套定义的:二维数组的元素是一维数组,三维数组的元素是二维数组-- 像array[2][3]这样的二维数组,是由两个一维数组组成的:array[0].array[1],这两个一维数组的规模都是array的第二个下标3.同时,array[0].array[1]就是

智能指针 shared_ptr 解析

最近正在进行<Effective C++>的第二遍阅读,书里面多个条款涉及到了shared_ptr智能指针,介绍的太分散,学习起来麻烦,写篇blog整理一下. LinJM   @HQU shared_ptr是一个智能指针.在C++ 11颁布之前,它包含在TR1(Technical Report 1)当中,现在囊括在C++11的标准库中. 智能指针 智能指针(Smart pointers)是存储"指向动态分配(在堆上)的对象的指针"的对象.也就是说,智能指针其实是个对象.不过

javascript语句——表达式语句、块语句、空语句和声明语句

× 目录 [1]表达式 [2]块语句 [3]空语句[4]声明 前面的话 如果表达式在javascript中是短语,那么语句(statement)就是javascript整句或命令.表达式计算出一个值,语句用来执行以使某件事发生.javascript程序无非就是一系列可执行语句的集合,javascript解释器依照语句的编写顺序依次执行.本文将介绍javascript语句中的四类语句——表达式语句.块语句.空语句和声明语句 表达式语句 表达式语句(expression statement)是jav

JSP中的声明语句块和表达式块

一.JSP中的声明语句块 在JSP页面中使用<%!%>括起来的部分,称为声明语句块.声明语句块中的内容,将被JSP引擎翻译到Servlet的类体中,是不会被包含到某个方法中的. 这样的话,在JSP的声明语句块中就可以声明实例变量.实例方法.静态方法.静态代码块等内容.并且,这些内容均可被JSP的的Java代码块中的代码访问.因为可以访问类属性的.不过,还是不建议在JSP的声明语句块中声明实例变量.因为JSP是运行在单例多线程环境下的,实例变量将会引起线程安全问题. 需要注意的是,在JSP的声明