摘自《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