[英]Trouble interpreting “if (result1) *result1 = t2” statement in C
我不是C程序員,但我正在將C程序翻譯成Delphi。 一切順利,但我無法弄清楚這樣的陳述的含義:
if (result1)
*result1 = t2;
似乎總是要執行賦值,然后測試某些條件?
如果有幫助,完整的C程序列在http://en.wikipedia.org/wiki/Talk%3ATrilateration 。
在C中,整數和布爾值之間存在同化:任何不為零的數字都表示正確。 在C 99中添加了bool
類型(遵循C ++的步驟),但是這些常見的用法難以根除(並且還有許多使用此約定的遺留源代碼)。
這句話的真正含義是:
if ( result1 != NULL ) {
*result1 = t2;
}
這意味着result1
是一個指針,如果此行之前的可能內存分配成功,則它用於存儲值t2
。
那么,這與指針有什么關系呢? 好吧,指針基本上是一個整數(一個內存地址),而NULL(非常常見,但並不總是)為零。 所以“result1”可以解釋為result1 != NULL
或甚至result1 != 0
。
最后,當內存分配(或任何其他內存操作)不成功時返回NULL
,因此在使用它之前測試指針是否處於活動狀態(即,它不是NULL
)是很常見的。
它測試指針result1
是否為null
。 如果為true
則將t2
指定為result1
值
在C / C ++中,取消引用NULL
指針是未定義的行為 。 簡而言之,如果你這樣做,可能會發生很糟糕的事情。
因此,在解除引用之前檢查NULL
指針始終是一個好習慣。
所述代碼就是這樣做的。
結果看起來像指針的指針。 如果它不為null,則將指向它的指針指向t2。
如果result1不為null,則result1指向地址為t2的地址點
if (result1 != NULL)
{
*result1 = t2;
}
如果result1是null
指針,則行*result = t2
應該導致SEGFAULT。
如果你想通過函數參數傳遞返回結果,它實際上是C中的常見模式。 C函數中沒有var
參數,因此您可以通過將指針作為參數傳遞給值來模擬該想法,然后函數可以通過指定指針所指向的位置來設置該值。
main
中的行看起來像這樣:
result = trilateration(&o1, &o2, p1, r1, p2, r2, p3, r3, MAXZERO);
創建指向變量o1和o2的內存地址的指針(這就是&
意思)。 然后是函數中的行
*result1 = t2;
將t2
分配給指向的result1
,在本例中為o1
。
這條線
if (result1)
測試指針是否為“true”(false與0相同,C中任何非零值為真),因此它與
if (result1 != NULL) // NULL is effectively the same as 0.
這樣做的原因是將NULL作為函數的第一個參數傳遞是合法的。 如果您只想獲取兩個結果值中的一個,則可能需要執行此操作。 所以,你可以安全地做到
result = trilateration(NULL, &o2, p1, r1, p2, r2, p3, r3, MAXZERO);
如果你不關心計算o1
。
result1
是一個指針; 它的值是內存中另一個對象的位置。
在C布爾上下文中,零值積分表達式求值為false
,而任何非零值積分表達式求值為true
。 在指針上下文中,零值積分表達式被視為NULL指針常量 ,它表示明確定義的“無處”並被視為無效指針值。
所以if (result1)
測試指針的值; 如果它為0,則表示result1
未指向任何有意義的值,並且由於0也表示為false
,因此將不執行if
語句的主體。 這是寫if (result1 != NULL)
的簡寫方式。 如果該值不為0,那么它是一個有效指針值(希望;見下文),測試通過,並且表達式*result1 = t2
的值寫入t2
通過向指向的位置result1
。
關於指針的幾點注意事項:首先,非NULL指針值不一定是有效指針,因為它的值可能與活動對象的地址不對應。 嘗試取消引用 (訪問指向的內存)無效指針的行為是未定義的; 你的程序可能會徹底崩潰,或者它可能繼續在糟糕的狀態下執行,或者它可能正常工作。 因此,在聲明它們時將所有指針初始化為NULL通常被認為是好的做法,並且當它們指向的任何指針不再使用時將它們設置為NULL。
其次,雖然空指針常量始終為零值,但實現使用的空指針值不一定是。 由編譯器來映射這些值,因此就源代碼而言,NULL總是表示0; 只是不要認為底層操作系統是真的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.