摘自《c專家編程》,代碼和答案都是基于gcc 4.6.1和32位linux系統(tǒng)。
某些解釋不夠全面和正確,如果是錯(cuò)誤,請指正。
1,解釋該聲明的含義:
char * const *(*next)();
2,解釋該聲明的含義:
char *(* c[10])(int **p);
3,解釋三個(gè)const的作用對象:
int foo(const char * const * const p);
4,下面的賦值為什么不能進(jìn)行:
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函數(shù)的聲明:
void (*signal(int sig, void(*func)(int)))(int);
9,解釋下面三個(gè)類型:
typedef int *ptr, (*fun)(), arr[5];
10,糾結(jié)不?
unsigned const long typedef int volatile *Shit;
11,解釋為什么在file2中使用s[i]會產(chǎn)生錯(cuò)誤:
/* 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);
}
個(gè)人理解的答案:
1,
char * const *(*next)();
next是一個(gè)函數(shù)指針,其指向的函數(shù)不帶參數(shù),返回一個(gè)指向const char字符的指針的指針。
2,
char *(* c[10])(int **p);
c是一個(gè)函數(shù)指針數(shù)組,數(shù)組大小為10,所指向的函數(shù)帶一個(gè)int **參數(shù),返回char *類型。
3,
int foo(const char * const * const p);
第一個(gè)const修飾第二個(gè)星號表示的指針;
第二個(gè)const修飾第二個(gè)星號表示的指針?biāo)傅膶ο骳har字符;
第三個(gè)const修飾指針p;
4,
第一個(gè)星號表示的指針?biāo)赶虻膶ο蟛煌羔橆愋筒煌?/span>
5,輸出:a < b
6,輸出:b = 65535
7,輸出:4
8,
void (*signal(int sig, void(*func)(int)))(int);
signal是一個(gè)函數(shù),接受一個(gè)int和func函數(shù)指針,返回一個(gè)函數(shù)指針。
9,
typedef int *ptr, (*fun)(), arr[5];
ptr是int*類型,
func是函數(shù)指針類型,函數(shù)返回int,參數(shù)為空
arr是int數(shù)組類型,長度是5
10,
unsigned const long typedef int volatile *Shit;
Shit是unsigned const long int volatile *類型。
11,
兩個(gè)s具有相同的地址值,但file2中,被聲明為指針,s指針?biāo)傅刂凡淮_定。
12,輸出:1
13,輸出:4