【问题标题】:Why pointer return 0 in foor loop为什么指针在for循环中返回0
【发布时间】:2017-02-28 20:16:27
【问题描述】:

我有以下功能:

void printKMax(int arr[], int n, int k){
    int* start = &arr[0];
    int* run = new int();
    if(n > 1){
        int* run = &arr[1];
        cout << "Initial run pointer " << *run << endl;
    }else {
        cout << *start << endl;
        return;
    }
    for(int i = 0; i < k-1; i++){
        cout << "Run in for loop " << *run << endl;
    }   
    delete run;
}

输入arr = {3 4 6 3 4} 和k = 4。 第一个 cout 打印 4,而 for 循环 cout 打印 0 三次。为什么它给0而不是4?为什么在 for 循环中取消引用指针与在 if 语句中不同?

【问题讨论】:

  • 你似乎对C++有不少误解。你应该退后一步,从一本好书中系统地学习语言。
  • 您有两个名为run 的变量,其中一个会影响另一个。
  • 您永远不会修改 顶级 run 变量。它永远不会改变它指向的内容,这是一个零初始化的int。
  • 而且你永远不会在循环内修改run。所以你将循环k-1 次打印完全相同的值。一遍又一遍。这就是你需要学习如何使用调试器的原因,这样你就可以自己发现这些愚蠢的问题。能够使用调试器是所有程序员的一项关键技能。
  • 修改外部run 指向数组将调用带有delete run 的UB。我认为@BaummitAugen 在这里有最相关的评论,这个问题不应该得到回答。

标签: c++ pointers for-loop


【解决方案1】:

在此声明中

int* run = new int();

声明了指针run,指向由零初始化的动态分配内存。

是循环中使用的变量

for(int i = 0; i < k-1; i++){
    cout << "Run in for loop " << *run << endl;
}   

if语句中声明的另一个同名指针

if(n > 1){
    int* run = &arr[1];

在 if 语句之外不存在。

【讨论】:

    【解决方案2】:

    您声明 int* 运行两次,填充第二个并显示第一个。

    【讨论】:

      【解决方案3】:

      你有两个不同的变量!一个在函数块中定义并初始化为包含0的地址,另一个在if的then块中定义并初始化为包含4的地址。

      您可以阅读有关变量声明/定义和标识符范围的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 2022-01-02
        相关资源
        最近更新 更多