Onway

我是一只菜菜菜菜鸟...
posts - 61, comments - 56, trackbacks - 0, articles - 34

一些纠结的c代码

Posted on 2012-05-28 11:52 Onway 阅读(369) 评论(0)  编辑 收藏 引用 所属分类: 码儿快跑
摘自《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

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理