摘自《c专家编程》,代码和答案都是基于gcc 4.6.1和32位linux系统。
某些解释不够全面和正确,如果是错误,请指正。
1,解释该声明的含义:
char * const *(*next)();
2,解释该声明的含义:
char *(* c[10])(int **p);
3,解释三个const的作用对象:
int foo(const char * const * const p);
4,下面的赋值为什么不能进行:
char **a = NULL;
const char **b = a;
5,下面的代码输出是什么:
main(int argc, char *argv[])
{
unsigned int a = 2;
int b = -2;
if (a > b)
printf("a > b\n");
else if (a == b)
printf("a == b\n");
else
printf("a < b\n");
}
6,下面代码输出的是什么:
foo(short int *a)
{
*(long int *)a = 0xFFFFFFFFL;
}
main(int argc, char *argv[])
{
short int a = 1;
short int b = 2;
foo(&a);
printf("b = %hu\n", b);
}
7,下面的代码输出是什么:
float a = 1.0;
long long int b = 1;
printf("%u\n", sizeof(a + b));
8,解释signal函数的声明:
void (*signal(int sig, void(*func)(int)))(int);
9,解释下面三个类型:
typedef int *ptr, (*fun)(), arr[5];
10,纠结不?
unsigned const long typedef int volatile *Shit;
11,解释为什么在file2中使用s[i]会产生错误:
/* file1 */
int s[3] = {1, 2, 3};
/* file2 */
extern int *s;
12,下面语句的输出是多少?
printf("%d\n", sizeof 'a');
13,下面代码的输出是多少?
func(char p[])
{
printf("%u\n", sizeof(p));
}
main()
{
char a[] = "hello";
func(a);
}
个人理解的答案:
1,
char * const *(*next)();
next是一个函数指针,其指向的函数不带参数,返回一个指向const char字符的指针的指针。
2,
char *(* c[10])(int **p);
c是一个函数指针数组,数组大小为10,所指向的函数带一个int **参数,返回char *类型。
3,
int foo(const char * const * const p);
第一个const修饰第二个星号表示的指针;
第二个const修饰第二个星号表示的指针所指的对象char字符;
第三个const修饰指针p;
4,
第一个星号表示的指针所指向的对象不同,指针类型不同。
5,输出:a < b
6,输出:b = 65535
7,输出:4
8,
void (*signal(int sig, void(*func)(int)))(int);
signal是一个函数,接受一个int和func函数指针,返回一个函数指针。
9,
typedef int *ptr, (*fun)(), arr[5];
ptr是int*类型,
func是函数指针类型,函数返回int,参数为空
arr是int数组类型,长度是5
10,
unsigned const long typedef int volatile *Shit;
Shit是unsigned const long int volatile *类型。
11,
两个s具有相同的地址值,但file2中,被声明为指针,s指针所指地址不确定。
12,输出:1
13,输出:4