2013-01-06 58 views
1

我在C++新手,我讀這本電子書叫Jumping into C++亞歷克斯·阿蘭這是非常有用的。這是一個有效的方法,通過它們的內存地址爲兩個變量的數字順序?

我最近完成了指針的篇章。還有在它要求你寫在棧上兩個不同的變量的內存地址進行比較的程序,並通過他們的地址的數字順序打印出變量的順序本章的最後一個實踐問題。

到目前爲止,我正在運行的程序,但我不滿意,如果我實現它的正確方法,我想了解我的解決方案的專家意見弄清楚,如果我走向正確的方向。下面是我自己的解決問題的辦法(意見和提示會有所幫助):

// pointersEx05.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <iostream> 
#include <string> 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int x,y; // two integer type variables 
    int *firstVal, *secondVal; // two pointers will point out to an int type variable 


    std::cout << "enter first value: "; 
    std::cin >> x; // prompt user for the first value 
    std::cout << std::endl << "enter second value: "; 
    std::cin >> y; // prompt user for the second value 
    std::cout << std::endl; 

    firstVal = &x; // point to the memory address of x 
    secondVal = &y; // point to the memory address of y 

    std::cout << firstVal << " = " << *firstVal; // print out the memory address of the first value and also the value in that address by dereferencing it 
    std::cout << "\n" << secondVal << " = " << *secondVal; // print out the memory address of the second value and also the value in that address by dereferencing it 

    std::cout << std::endl; 


    if(firstVal > secondVal){ // check if the memory address of the first value is greater than the memory address of the second value 
     std::cout << *secondVal << ", "; // if true print out second value first then the first value 
     std::cout << *firstVal; 
    }else if(secondVal > firstVal){ // check if the memory address of the second value is greater than the memory address of the first value 
     std::cout << *firstVal << ", "; // if true print out first value first then the second value 
     std::cout << *secondVal << ", "; 
    } 
    return 0; 
} 
+0

我明白無論是目標,也不是問題;抱歉。 –

+0

在C99或更高版本,您可以將兩個指針,以'uintptr_t'轉換(從'#包括'或'的#include ')和比較這些轉換後的值。它可能已經接近便攜式,但仍不能保證該標準。 –

+0

畢竟已經在這個線程已經說了,可能是推薦的方式來做到這一點是使用[2]',而不是單獨的'x'和'y',然後將鼠標指針比較就定義好'INT XY。作爲一個方面說明,比較指向數組成員的指針是你在C中經常做的事情,而不是比較任意指向變量的指針。我甚至不能想象爲一個體面的例子:d –

回答

3

這是「正確的」,但它沒有明確的行爲。您只能比較同一陣列中元素的地址,或者同一個結構實例的成員。從C99(6.5.8):*

當兩個指針進行比較,其結果取決於物體的地址空間中的相對位置 指向。如果兩個 指針對象或不完整的類型都指向同一個對象, 或兩個點的一個過去的相同的數組對象的最後一個元素,它們 比較相等。如果指向的對象是聚合對象相同的成員,則指向稍後聲明的結構成員的指針比指向結構中早些時候聲明的成員的指針 指針大,指向具有較大下標值的數組元素的指針大於指向元素的指針比較 與下面的 下標值相同的數組。所有指向同一聯盟對象 成員的指針相等。如果表達式P指向數組 對象的元素並且表達式Q指向同一數組對象的最後一個元素,則指針表達式Q + 1的比較大於P. 在 的所有其他情況下,行爲是未定義。

(empahsis礦)

所以這可能是你的上司一直在尋找,這將可能是「工作」,但它仍然不是有效的,只要語言標準的關注。


*第[expr.rel]中的C++標準(S)說,類似的東西,但它是更冗長,由於警告類成員等。它還指出,其他任何東西都是「未指定」而非「未定義」。

+0

這仍然是不_C良好定義的行爲++ _ –

+0

我很好奇。這是不是很好定義? –

+0

@AndreasGrapentin:看看C99標準的6.5.8節;它明確指出這是未定義的行爲。 (但就像我說的,我只是假設這是在C++相同。) –

0

作爲一個學術任務這是完全正常的..你完成這本書的「要求」

+0

@DaijDjan酷,我現在感覺好多了。 – Rojee

相關問題