为什么这个交换工作而另一个不工作

F22*_*ing 3 c arrays pointers

我正在帮助我的朋友完成一项任务,因为我使用了C已经有一段时间了,所以我找不到为什么这样有效,但第一个代码有效,第二个代码没有.这不是因为我们想出来的任务,但我想知道为什么会发生这种情况.

void GnomeSort( int gnomes[], int length ) {

    int pos = 1;

    while ( pos < length ) {

        if ( gnomes[ pos ] >= gnomes[ pos - 1 ] ) {

            pos = pos + 1;
        }
        else {

            swap( gnomes + pos, gnomes + pos - 1 );
            if ( pos > 1 ) {

                pos = pos - 1;
            }
        }
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

这不起作用:

void GnomeSort( int gnomes[], int length ) {

    int pos = 1;

    while ( pos < length ) {

        if ( gnomes[ pos ] >= gnomes[ pos - 1 ] ) {

            pos = pos + 1;
        }
        else {

            swap( gnomes[ pos ], gnomes[ pos - 1 ] );
            if ( pos > 1 ) {

                pos = pos - 1;
            }
        }
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

不同的是swap电话:

swap( gnomes + pos, gnomes + pos - 1 );
Run Code Online (Sandbox Code Playgroud)

而不是:

swap( gnomes[ pos ], gnomes[ pos - 1 ] );
Run Code Online (Sandbox Code Playgroud)

这是无法更改的交换功能:

void swap(int* ptrA, int* ptrB) {
    int temp = *ptrA;
    *ptrA = *ptrB;
    *ptrB = temp;
    return;
}
Run Code Online (Sandbox Code Playgroud)

它显然是交换功能的输入,但是这样吗?还有哪些其他方法可以输入交换功能?

Dai*_*Dai 6

这是因为gnomes + pos不等同于gnomes[pos].

  • gnomes + pos将返回指针值.这是因为a pointerType + integerType => pointerType.

  • gnomes[pos]实际上*(gnomes+pos),所以你最终会将一个取消引用的指针值(int在你的情况下)传递给swap函数.

你的编译器应该给你一个错误,或者至少是一个警告.