我正在帮助我的朋友完成一项任务,因为我使用了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)
它显然是交换功能的输入,但是这样吗?还有哪些其他方法可以输入交换功能?
这是因为gnomes + pos不等同于gnomes[pos].
gnomes + pos将返回指针值.这是因为a pointerType + integerType => pointerType.
gnomes[pos]实际上*(gnomes+pos),所以你最终会将一个取消引用的指针值(int在你的情况下)传递给swap函数.
你的编译器应该给你一个错误,或者至少是一个警告.