资源描述
int f( );
说明:把f申明为一个函数,其返回值是一个整数。
int *f( );
说明:先确定表达式*f()是如何进行求值的。首先执行的是函数调用操作符(),因为它的优先级最高。所以f是一个函数,它的返回值是一个指向整数的指针。
int (*f)( );
说明:首先确定括号的含义。()是函数调用操作符,(*f)只起到聚组的作用,使间接访问在函数调用之前进行,则f成为一个函数指针,它所指向的函数返回一个整型值。
int *(*f)( );
说明:f是一个函数指针,它所指向的函数返回一个整型指针。
int f[ ];
说明:f是一个整型数组。
int *f[ ];
说明:下标优先级更高,所以f是一个数组,它的元素类型是指向整型的指针。
int f( )[ ];
说明: f是一个函数,它的返回值是一个整型数组。这个申明非法,因为函数不能返回数组。
int f[ ]( );
说明:本意指f是一个数组,它的元素类型是返回值为整型的函数。但此申明非法,因为数组元素必须具有相同的长度,但不同的函数显然可能具有不同的长度。
int (*f[ ])( );
说明:首先确定括号的含义和操作符执行顺序。*f[ ]首先求值,则f是一个元素为某种类型的指针的数组。()是函数调用操作符,则f表示一个数组,数组元素的类型是函数指针,它指向的函数返回值是一个整型值。
int *(*f[ ])( );
说明:与上面类似。f是一个指针数组,指针所指向的类型是返回值为整型指针的函数。
有如下的申明,
int array[ 12 ][ 31 ];
请问array[4]是什么意思?sizeof(array[4])等于多少?
array是一个有着12个数组类型元素的数组,每个数组类型元素又是一个有31个int型元素的数组,所以array[4]是array数组的第5个元素,这个元素是有31个int类型的数组。那么
sizeof(array[4]) = 31 * sizeof(int);
有如下的申明,
int array[ 12 ][ 31 ];
int i;
表达式i = array[4][7];还可以替换成怎样的表示方法?
i = *(array[4] + 7);
或
i = *(*(array + 4) + 7);
int (*f)[31];
说明:申明*f是一个拥有31个 int元素的数组,因此f就是一个指向拥有31个 int元素的数组的指针。
请说出如下代码的编译运行结果,并说明原因:
int main()
{
char c;
c = ‘1’;
if(c == ‘1’ || c = ’2’ || c == ‘3’)
printf(“+++ 1\n”);
else
printf(“+++ 2\n”);
return 0;
}
说明:由运算法优先级的规则,if(c == ‘1’ || c = ’2’ || c == ‘3’)等价于
if((c == ‘1’ || c) = (’2’ || c == ‘3’))
则这个是非法操作,编译时会报错。
请说出如下代码的编译运行结果,并说明原因:
int main()
{
int a, b, c, *p;
p = &b;
a = 10000 ;
b = 100 ;
c = a /*p ;
printf(“c = %d\n”, c);
return 0;
}
说明:请注意符号/* ,c代码注释的前导符,程序编译报错。
请指出如下代码的意思并分析,
(*(void)(*)( ) ) 0) ( );
说明:此语句意思是调用地址为0位置的子程序。假设变量fp是一个函数指针,则
(*fp)();
表示调用fp所指向的函数。那么调用位置0的函数,似乎可以用
(*0)();
但不正确,因为运算符*必须要一个指针来做操作,这个指针必须是函数指针。所以必须要对0做类型转换,即将0转为“指向返回值为void类型的函数的指针”,可以表示为(void)(*)( ) ) 0,带入上面的(*0)();即可得到:
(*(void)(*)( ) ) 0) ( );
4
展开阅读全文