C专家编程学习之第一章

来源:互联网 发布:bartender vb脚本 编辑:程序博客网 时间:2024/05/17 01:53


对于以下程序:

foo(const char **p)
{

}

int main(int argc, char *argv[])
{
    foo(argv);
}

编译时, 会出现 warning: passing argument 1 of ‘foo’ from incompatible pointer type, expected ‘const char **’ but argument is of type ‘char **’

要使上述的赋值形式合法,必须满足下列条件之一:
    两个操作数都是指向有限定符或者没有限定符的相容类型的指针,左边的指针所指向的类型必须具有右边指针指向类型的全部限定符。

    对于const确实有点费解。且看下面:
    const int *p;        //p可变,p指向的对象不可变
    int const *p;        //p可变,p指向的对象不可变
    int *const p;        //p不可变,p指向的对象可变
    const int *const p  //指针p和p指向的对象都不可变

    回到刚才赋值的时候,那么对于const float *p类型, 我们很容易就知道const 修饰的并不是指针,它的类型是——“指向一个具有const限定符的float类型的指针”,也就是说const限定符修饰的是指针所指向的类型(对象), 而不是指针本身!!

    类似的,cosnt char **也是一个没有限定符的指针类型, 它的类型是“指向一个具有const限定符的char类型的指针的指针”。
    这样看来,char **和 const char **都是没有限定符的指针类型, 那为什么它们不相容呢?原因很简单,因为它们所指向的类型不一样。
    char **所指向的是char *, 而char **所指向的是const char *,因此,它们并不相容。


浅谈类型转变
先看一下以下程序:
int array[] = {1, 2, 3, 4, 5, 6};
#define TOTAL_ELEMENTS ((sizeof(array)/sizeof(array[0])))

main ()
{
    int d = -1;
    int x;

    if (d < = (TOTAL_ELEMENTS - 2))
    {
        x = array[d+1];
    }

}

TOTAL_ELEMENTS所定义的类型是unsigned int 类型, 因为sizeof 的返回类型是无符号数。if语句在signed int 和unsigned int之间测试相等性,所以d被升级为unsigned int 类型,-1会被转换成一个很大的整数,导致表达式的值为假。
因此,一般情况下,我们最好,强制转换一下:
if (d <= (int)(TOTAL_ELEMENTS - 2))

    建议:
    尽量不要在代码中使用无符号数,以避免增加不必要的复杂度。