C ++中指针的奇怪行为

时间:2015-09-17 16:19:00

标签: c++ pointers

#include <cstdlib>
#include <iostream>
#include <Math.h>
#include <algorithm>
#include <string>
#include <iterator>
#include <iostream>
#include <vector>       // std::vector


using namespace std;

int stepCount, i, x, y, z, j, k, array1Size, array2Size, tester, checker;
int numstring[10] = { 0,1,2,3,4,5,6,7,8,9 };
int numstringTest[10] = { 0,1,2,3,4,5,6,7,7,9 };
int* numbers;
int* differentNumbers;
int* p;
int* otherNumbers;
void stepCounter(int a) {

    // determines the step number of the number
    if (a / 10 == 0)
        stepCount = 1;
    else if (a / 100 == 0)
        stepCount = 2;
    else if (a / 1000 == 0)
        stepCount = 3;
    else if (a / 10000 == 0)
        stepCount = 4;
    else if (a / 100000 == 0)
        stepCount = 5;
    else if (a / 1000000 == 0)
        stepCount = 6;
    else if (a / 10000000 == 0)
        stepCount = 7;
    else if (a / 100000000 == 0)
        stepCount = 8;
    else if (a / 1000000000 == 0)
        stepCount = 9;

}
void stepIndicator(int b) {
    // indicates each step of the number and pass them into array 'number'
    stepCounter(b);
    numbers = new int[stepCount];

    for (i = stepCount; i>0; i--) {
        //
        /*
        x = (round(pow(10,stepCount+1-i)));
        y = (round(pow(10,stepCount-i)));
        z = (round(pow(10,stepCount-i)));
        */
        x = (int)(pow(10, stepCount + 1 - i) + 0.5);
        y = (int)(pow(10, stepCount - i) + 0.5);
        numbers[i - 1] = (b%x - b%y) / y;
    }

}


int sameNumberCheck(int *array, int arraySize) {
    //checks if the array has two or more of same integer inside return 1 if same numbers exist, 0 if not
    for (i = 0; i<arraySize - 1; i++) {
        //
        for (j = i + 1; j<arraySize; j++) {
            //
            if (array[i] == array[j]) {
                //
                return 1;
            }
        }

    }
    return 0;
}


void getDifferentNumbers(int* array, int arraySize) {
    //
    k = 0;
    j = 0;
    checker = 0;
    otherNumbers = new int[10 - arraySize]; //exact number of other numbers is 10 - numbers we have
    for (i = 0; i<10; i++) {
        if ((i>0)&(checker = 0)) {
            k++;
            otherNumbers[k - 1] = i - 1;
        }
        //
        checker = 0;

        for (j = 0; j<arraySize; j++) {
            //
            p = array + j;
            cout << *p << endl; //ilkinde doğru sonra yanlış yapıyor?!
            if (*p = i) {
                checker++;
            }
        }

    }

}

int main(int argc, char *argv[])
{
    stepCounter(999999);
    cout << stepCount << endl;

    stepIndicator(826424563);
    for (j = 0; j<9; j++) {
        //
        cout << numbers[j] << endl;
    }
    cout << sameNumberCheck(numstringTest, 10) << " must be 1" << endl;
    cout << sameNumberCheck(numstring, 10) << " must be 0" << endl;
    cout << endl;

    getDifferentNumbers(numstringTest, 10);
    cout << endl;

    cout << endl << otherNumbers[0] << " is the diff number" << endl;


    system("PAUSE");
    return EXIT_SUCCESS;
}

嗨,我的问题实际上是指针。您将在上面看到函数getDifferentNumbers。如果在任何给定的数组中有重复的数字(0-9),它只是进行比较。为此,我传递了一个指向该函数的指针。我只是通过指针进行比较。但是,这里有一件奇怪的事情。当我执行时,第一次它确实正确,但是secon时间它完全疯了!这是功能:

void getDifferentNumbers(int* array, int arraySize) {
    //
    k = 0;
    j = 0;
    checker = 0;
    otherNumbers = new int[10 - arraySize]; //exact number of other numbers is 10 - numbers we have
    for (i = 0; i<10; i++) {
        if ((i>0)&(checker = 0)) {
            k++;
            otherNumbers[k - 1] = i - 1;
        }
        //
        checker = 0;

        for (j = 0; j<arraySize; j++) {
            //
            p = array + j;
            cout << *p << endl; //ilkinde doğru sonra yanlış yapıyor?!
            if (*p = i) {
                checker++;
            }
        }

    }

}

这是我传递给函数的数组:

int numstringTest[10] = {0,1,2,3,4,5,6,7,7,9};

它应该在otherNumbers [0]中给出数字7,但它不会。同时我不知道为什么。我真的看不到任何错误的陈述或操作。当我执行时,它首先输出正确的

numstringTest: 1,2,3,4,5,6,7,7,9

但是在for循环的下一个9次迭代中它输出:

000000000011111111112222222222333333333344444444445555555555666666666677777777778888888888

2 个答案:

答案 0 :(得分:6)

您的代码中存在一些基本问题。

有多种比较不是真正的比较,而是分配。请参阅以下内容:

if((i>0) & (checker=0)){

if(*p = i){

在这两种情况下,您都要为变量赋值,而不是比较它们。平等比较应使用==,而不是=。例如:

if (checker == 0) {

除此之外,您使用&(按位AND)而不是&&(逻辑AND),这是完全不同的事情。您最有可能在&&声明中if

答案 1 :(得分:0)

我刚注意到这一点:

getDifferentNumbers(numstringTest, 10);

并在该职能中:

otherNumbers = new int[10 - arraySize];

这似乎不对。