1

我是 C++ 的新手,我正在阅读 Alex Alllain 的这本名为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;
}
4

3 回答 3

3

这是“正确的”,但它不是明确定义的行为。您只能比较同一数组中元素的地址,或同一结构实例的成员。从 C99 (6.5.8) 开始:*

比较两个指针时,结果取决于所指向对象在地址空间中的相对位置。如果两个指向对象或不完整类型的指针都指向同一个对象,或者都指向同一个数组对象的最后一个元素,它们比较相等。如果指向的对象是同一个聚合对象的成员,则指向稍后声明的结构成员的指针比较大于指向结构中较早声明的成员的指针,并且指向具有较大下标值的数组元素的指针比较大于指向同一数组的元素的指针具有较低的下标值。所有指向同一个联合对象成员的指针比较相等。如果表达式 P 指向一个数组对象的一个​​元素,而表达式 Q 指向同一个数组对象的最后一个元素,在所有其他情况下,行为是未定义的。

(强调我的)

所以这可能是你的主管正在寻找的,它可能会“工作”,但就语言标准而言,它仍然无效。


* C++ 标准的 [expr.rel] 部分说了类似的话,但由于对类成员的警告等原因,它更加冗长。它还指出,其他任何东西都是“未指定的”而不是“未定义的”。

于 2013-01-06T19:10:38.543 回答
0

作为一项学术任务,这完全没问题..你满足了这本书的“要求”

于 2013-01-06T19:17:00.450 回答
0

正如其他人指出的那样,比较未指向同一聚合中对象的指针是未定义的行为。但是您可以使用 std::less 对指针类型进行总排序(请参阅:http ://en.cppreference.com/w/cpp/utility/functional/less )

于 2013-01-07T16:08:06.563 回答