C核心技术手册(二十九)

翻译 2011年01月21日 23:37:00

4.2 非算术类型转换

  指针和数组名,还有函数名也遵循隐式和显式类型转换,结构体和联合体不能转换,虽然它们的指导可以转换为其他的指针类型。

4.2.1数组和函数操作指示符

  一个数组或函数操作指示符为具有类型的任何表达式,在大多数情况下,编译器隐式地转换一个数组的类型,及数组的名子转为数组首元素的指针,数组表达式在以下情景下不能转换为指针:

l  当使用sizeof操作符操作数组时;

l  当使用&操作符时;

l  当使用字符串变量初始化charwchar_t数组时;

下面的例子示范了隐式转换数组操作符为指针,使用%p打印指针值:

    #include <stdio.h>
    int *iPtr = 0;                      // A pointer to int, initialized with 0.
    int iArray[ ] = { 0, 10, 20 };       // An array of int, initialized.
   int array_length = sizeof(iArray) / sizeof(int); // The number of elements:
                                                     // in this case, 3.
    printf("The array starts at the address %p./n", iArray);
     *iArray = 5;                      // Equivalent to iArray[0] = 5;
     iPtr = iArray + array_length - 1; // Point to the last element of iArray:
                                      // Equivalent to
                                      // iPtr = &iArray[array_length-1];
 printf("The last element of the array is %d./n", *iPtr);

在初始化array_length时,表达式sizeof(iArray)取得了数组的长度,而不是指针的大小,然而,在其他三个语句中,指示符iArray隐式地转换为一个指针,如下:

l  在第一次调用printf();

l  在使用操作符*;

l  iPtr赋值时;

 

字符数组的名子在字符串操作中也当做指针使用,如下例:

    #include <stdio.h>
    #include <string.h>            // Declares size_t strlen( const char *s )
     char msg[80] = "I'm a string literal.";    // Initialize an array of char.
    printf("The string is %d characters long./n", strlen(msg));
                                               // Answer: 21.
    printf("The array named msg is %d bytes long./n", sizeof(msg));
                                               // Answer: 80.

本例中strlen(msg)调用中,标识符msg隐式地转换为指向数组首元素的指针,类型为函数的入参类型const char *, strlen()仅仅统计字符开始到第一个null字符出现时所有的字符个数。

  类似地,任何表示函数的表达式,如函数名,也可以隐式地转换为指向函数的指针,同样,当使用地址操作符&时,将不会使用这种转换,sizeof操作符不能使用在函数类型的操作中。下面的例子描述了函数名隐式转换为指针,程序初始化了指向函数的指针,函数的调用在一个循环中。

    #include <stdio.h>
    void func0( ) { puts("This is the function func0( ). "); }  // Two functions.
    void func1( ) { puts("This is the function func1( ). "); }
    /* ... */
    void (*funcTable[2])(void) = { func0, func1 }; // Array of two pointers to
                                                   // functions returning void.
    for ( int i = 0; i < 2; ++i )   // Use the loop counter as the array index.
       funcTable[i]( );

相关文章推荐

C核心技术手册(四十四)

GCC 编译 优化
  • dyx1024
  • dyx1024
  • 2011年05月03日 23:45
  • 861

C核心技术手册(二十二)

字符常量
  • dyx1024
  • dyx1024
  • 2011年01月04日 22:14
  • 895

C核心技术手册(二十一)

浮点常量可被写为十进制或十六进制
  • dyx1024
  • dyx1024
  • 2011年01月03日 23:53
  • 618

C核心技术手册(三十八)

连接
  • dyx1024
  • dyx1024
  • 2011年04月19日 00:10
  • 898

C核心技术手册(二十七)

算术类型转换结果(_Bool类型转换 和 无符号整型转换)
  • dyx1024
  • dyx1024
  • 2011年01月17日 00:06
  • 647

C核心技术手册(二十三)

字符串常量
  • dyx1024
  • dyx1024
  • 2011年01月08日 00:01
  • 2201

C核心技术手册(三十)

显式指针转换(对象指针、函数指针)
  • dyx1024
  • dyx1024
  • 2011年01月23日 18:39
  • 639

C核心技术手册(三十九)

多个源文件的编译
  • dyx1024
  • dyx1024
  • 2011年04月20日 00:11
  • 805

C核心技术手册(三十四)

表达式求值、左值
  • dyx1024
  • dyx1024
  • 2011年02月13日 00:06
  • 791

C核心技术手册(三十七)

GCC常用选项的介绍
  • dyx1024
  • dyx1024
  • 2011年04月17日 23:29
  • 838
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C核心技术手册(二十九)
举报原因:
原因补充:

(最多只允许输入30个字)