C核心技術手冊(二十九)

2021-09-30 16:06:56 字數 2230 閱讀 4270

指標和陣列名,還有函式名也遵循隱式和顯式型別轉換,結構體和聯合體不能轉換,雖然它們的指導可以轉換為其他的指標型別。

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];

printf("the last element of the array is %d./n", *iptr);

在初始化array_length

時,表示式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...