char ch[] 与 char *ch 的区别

1)
    char ch[2]={'c','b'};
    // 输出的的值相同
    printf("%d\n",ch);
    printf("%d\n",&ch);

    char (*f)[2] = &ch ; // f是指向 char[2]  类型的指针,与数组的首地址相等
    printf("%c,%c",f[0],f[1]);

    char *pch="abc";
   // 输出的的值不相同
    printf("%d\n",pch);
    printf("%d\n",&pch);

2)
   char stra[10] = “howareypu”; // 字符串数组,用字符串常量进行初始化 不能改变大小或重分配 但可改变内容
   stra[1] = ‘b’ ; // ok
   char *strb = “wondebbic”;      // str指向字符串常量,不能修改
   strb[1] = ‘e’ ; // error
 
   stra是数组名
   strb是指针
  
  根据x是数组还是指针, 类似 x[3] 这样的引用会生成不同的代码。认识到这一点大有裨益。
 
   以上面的声明为例, 当编译器看到表达式 stra[3] 的时候, 它生成代码从stra的位置开始跳
   过3个, 然后取出那个字符
.   如果它看到strb[3], 它生成代码找到strb 的位置, 取出其中
   的指针值,
在指针上加 3 然后取出指向的字符。换言之, stra[3]是名为stra的对象(的起始
   位置) 之后3个位置的值, 而strb[3] 是strb 指向的对象的3个位置之后的值.

   本质的区别在于类似 stra 的数组和类似 strb 的指针一旦在表达式中出现就会按照不同的方法计算

   所以当在一个源文件中定义了char a[6], 在另一个文件中声明了extern char  *a 。这样是错误的。

3)
  当数组名作为函数参数的时候,数组名就转化为指针。
  例:
 

void func(char *str)
{
    printf( "%d\n" , sizeof(str) );
    return 0 ;
}

int main(  )
{
    char str[9]="howareyou";
    printf( "%d\n" , sizeof(str));  // 9 数组的大小
    func(str);                             // 4  指针的大小
}


“指针与数字等价” ??

它的意思是说数组和指针的算法定义可以用指针方便的访问数组或者模拟数组。

特别地, 等价的基础来自这个关键定义:

    一个 T 的数组类型的左值如果出现在表达式中会蜕变为一个指向数
    组第一个成员的指针(除了三种例外情况); 结果指针的类型是 T 的
    指针。

这就是说, 一旦数组出现在表达式中, 编译器会隐式地生成一个指向数组第一
个成员地指针, 就像程序员写出了 &a[0] 一样。例外的情况是, 数组为sizeof
或 & 操作符的操作数, 或者为字符数组的字符串初始值。

posted @ 2009-11-08 16:28  jackyxm  阅读(8372)  评论(0)    收藏  举报