C专家编程 精编之一 第一章~第三章
C的复杂之处 在于它的指针 ,但是比其指针更为复杂的是它的声明 !!!
你能看懂它们的意思 吗?
apple=sizeof(int)*p ; apple=sizeof * p;
j= (char (*)[20])malloc(20);
int const * grape; 与 int * const grape; 的区别
typedef void (*ptr_to_func)(int);
void (*signal(int sig,void (*func)(int )))(int );
几个样例:
一:char *a; const char *b; a=b;//出现警告. why?
二: const int two =2;
switch(i)
{
case 1:printf("case 1 ! /n");
case two :printf("case 2/n");
}
编译出错,说明了.....?
三:switch(){..}中把 default改成 defau1t (无心之过,或其它标签如defavlt,dafault..)都编译通过 . why?
四: apple=sizeof(int)*p ; apple=sizeof * p; //是什么意思? 另外, y=sizeof x; 能编译通过吗?
五: j= (char (*)[20])malloc(20); //怎么样?
六: result=*x/*y ; //出错?why ?
z=y+++x; 即为: z=y++ +x; 但z=y+ + +x; z=y+ ++x; 呢?
七: const int * grape;
int const * grape;
int * const grape; //有什么区别?
八: int (* fun())()
int (* fun())[]
int (* funp[])() //各是什么意思?
九: void (*signal(int sig,void (*func)(int )))(int ); //什么意思??
十: typedef void (*ptr_to_func)(int); //这个用法,你会吗?
十一:struct foo{int foo;}foo; // 合法! 那么,sizeof(foo)又表示哪一个foo呢?
.........
以上几个例子是这篇文章的主要内容,是我根据 C专家编程 前三章 的主要内容整理的.
如果对上面的问题很清楚,那么就没有必要看下去,
如果对C一点都不了解,也没有必要看下去.
如果对C非常感兴趣,同样也没有必要看下去,直接看书吧...
问题一:实参char * s 与形参 const char *p是相容的,但是为什么 实参 char * *argv 与形参 const char **p实际上不能相容?
例:
foo(const char **p){ }
main(int argc,char **argv)
{
foo(argv);
}
//产生warning:argument is incompatible with prototype 即 警告:参数与原型不匹配
问题产生: 实参 char *s 与 形参const char *p应该是相容的,那么为什么 实参 char * *argv 与形参 const char **p实际上不能相容?
答案途径: ANSI C 标准.
6.3.2.2: 每个实参都应该具有自己的类型.这样它的值就可以赋值给与它所对应的形参类型的对象(该对象的类型不能含有限定符). 也就是说参数传递过程类似于赋值.
//即:const char **类型的对象可以赋值给一个类型为 char **的值,否则..... //why?
赋值规则: 6.3.16.1:
要使上面的赋值合法,必须满足下列条件:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向