指向数组元素的指针打印内存地址而不是元素的值

时间:2014-04-02 00:44:27

标签: c++ arrays pointers

我目前正在为一个类编写程序,该类将用户输入添加到动态数组中或从动态数组中删除数字,然后按升序打印数组的所有值。

根据我已经研究过的,我需要做的就是获取要打印的数组中元素的值,以确保在指针名称旁边插入解除引用操作符。但是,当完成如下( newArray [i])时,我得到一个编译时错误,说明' '右边的操作数。必须是一个指针,即使newArray在函数的开头被声明为指针。

void output(int *arrayPtr, int size){
int small;
int i, j;
int *newArray;
newArray = new int[size];

for (i = 0; i < size; i++){
    *newArray[i] = arrayPtr[i];
}

for (i = 0; i < size; i++){
    small = *newArray[i];
    for (j = 0; j < size; j++){
        if (*newArray[j] < small){
            *newArray[j] = small;
        }
        std::cout << small;
    }
    int number = small;
    removeNumber(*& arrayPtr, number, size);
}

}

我觉得有一些我完全不知道的东西,但我非常感谢任何帮助或想法!

1 个答案:

答案 0 :(得分:1)

 small = *newArray[i];

那应该只是:

 small = newArray[i];

(在您比较/分配*newArray[i]

的其他地方也是如此

您的第一个操作是首先取消引用newArray,这意味着它获取数组中第一个元素的值,然后尝试对其进行索引。元素不是指针,所以这当然失败了。索引时,它还隐式取消引用指针。你也可以写:

small = *(newArray + i);

但是,通常只在需要实际指针时使用指针运算,因为如果需要值,索引更容易阅读。

通过您的代码,其他一些事情似乎已经消失:

for (i = 0; i < size; i++){
    *newArray[i] = arrayPtr[i];
}

这可能会编译,但我不认为这是对的,我猜你的意思是:

for (i = 0; i < size; i++){
    newArray[i] = arrayPtr[i];
}  

此外:

removeNumber(*& arrayPtr, number, size);

虽然这在技术上是正确的,但*&首先返回指针引用,然后转身并再次取消引用它。如果编译器无论如何都要优化它,我不会感到惊讶,但这是不必要的。