这似乎是一个很凝重的话题,但是它真的很有趣。
1. 指针是指向某一类型的东西,任何一个整体,只要能称为整体就能拥有它自己的独一无二的指针类型,所以指针的类型其实是近似无穷无尽的
2. 函数名在表达式中总是以函数指针的身份呈现,除了取地址运算符以及sizeof
3. C语言最晦涩难明的就是它复杂的声明: void (*signal(int sig, void (*func)(int)))(int),试试着把它改写成容易理解的形式
4. 对于指针,尽最大的限度使用const保护它,无论是传递给函数,还是自己使用
先来看看一个特殊的指针,姑且称它为指针,因为它依赖于环境: NULL,是一个神奇的东西。先附上定义,在编译器中会有两种NULL(每种环境都有唯一确定的NULL):
#define NULL 0
#define NULL ((void*)0)
有什么区别吗?看起来没什么区别都是0,只不过一个是常量,一个是地址为0的指针。
当它们都作为指针的值时并不会报错或者警告,即编译器或者说C标准认为这是合法的:
int* temp_int_1 = 0; //无警告
int* temp_int_2 = (void*)0; //无警告
int* temp_int_3 = 10; //出现警告
为什么?为什么0可以赋值给指针,但是10却不行?他们都是常量。
因为C语言规定当处理上下文的编译器发现常量0出现在指针赋值的语句中,它就作为指针使用,似乎很扯淡,可是却是如此。
回到最开始,对于NULL的两种情况,会有什么区别?拿字符串来说,实际上我是将字符数组看作是C风格字符串。
在C语言中,字符数组是用来存储一连串有意义的字符,默认在这些字符的结尾添加'