指標和陣列名,還有函式名也遵循隱式和顯式型別轉換,結構體和聯合體不能轉換,雖然它們的指導可以轉換為其他的指標型別。
4.2.1
陣列和函式操作指示符
乙個陣列或函式操作指示符為具有型別的任何表示式,在大多數情況下,編譯器隱式地轉換乙個陣列的型別,及陣列的名子轉為陣列首元素的指標,陣列表示式在以下情景下不能轉換為指標: l
當使用sizeof
操作符運算元組時; l
當使用&
操作符時; l
當使用字串變數初始化char
或wchar_t
陣列時;
下面的例子示範了隱式轉換陣列操作符為指標,使用%p
列印指標值:
#include
int *iptr = 0; // a pointer to int, initialized with 0.
int iarray[ ] = ; // 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];
在初始化array_lengthprintf("the last element of the array is %d./n", *iptr);
時,表示式sizeof(iarray)
取得了陣列的長度,而不是指標的大小,然而,在其他三個語句中,指示符iarray
隱式地轉換為乙個指標,如下: l
在第一次呼叫printf()時;
l在使用操作符*時;
l給iptr
賦值時;
字元陣列的名子在字串操作中也當做指標使用,如下例:
#include
#include // 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
void func0( ) // two functions.
void func1( )
/* ... */
void (*functable[2])(void) = ; // 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核心技術手冊(二十)
在c 中,常量是表示乙個固定值的記號,它可能是整型 浮點型 字元 或乙個串。乙個常量的型別由它的值和記法來決定。這裡討論的常與混合常量不同,混合常量在c99 標準中介紹,它通常是可修改的物件,類似於變數,了解混合常量的詳細介紹和特殊操作可參見第五章。乙個整型常量可以以普通的十進位制數表示,或者是八進...
C核心技術手冊(二十四)
在 c中,不同型別的操作可以化合成乙個操作,例如,下面的表述式 double dvar 2.5 define dvar as a variable of type double.dvar 3 multiply dvar by an integer constant.if dvar 10l compa...
C核心技術手冊(二十五)
型別轉換通常存在於任意兩個算數型別中,當必要時,編譯器隱式地執行它們,如果新型別能夠表示它,此種轉換將保護它的值,這通常也並不絕對,例如,當你將乙個負數轉換為無符號型別,或將乙個浮點數的小數部分由 double 轉換為int 時,新型別不能表示原來的值,在這種情況下,編譯器會產生乙個告警。4.1.1...