簡體   English   中英

無法解釋C中的“if(result1)* result1 = t2”語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM