我已經用 C 編程語言實作了一個程式來反轉整數陣列(作為練習)
#include <stdio.h>
#define procedure void
procedure reverse_arr(int A[], size_t N)
{
for(int i = 0; i < N / 2; i ){
A[i] = A[i] ^ A[N-1-i];
A[N-1-i] = A[N-1-i] ^ A[i];
A[i] = A[i] ^ A[N-1-i];
}
}
procedure print_array(int A[], size_t N)
{
for(int i = 0; i < N; i )
printf("%d\n", A[i]);
}
int main()
{
int A[5] = {1, 2, 3, 4 ,5};
print_array(A, sizeof(A));
reverse_arr(A, sizeof(A));
print_array(A, sizeof(A));
}
我已經對其進行了測驗,它給了我以下結果:
1 2 3 4 5 0 -13168 0-13088 0 -2147180803 1 -2139062144 -2139062144 -21471809111 -13168 0 6 0 0 60 -13168 1 -2147180911 -2139062144 -2139062144 1-2147180803 0 -13088 0 -13168 0 54 3 2 1
正如你所看到的,一開始它列印原始陣列,最后它列印反向陣列,但為什么它列印中間的垃圾?陣列大小似乎沒有問題,據我所知,在將其作為函式引數傳遞時,在編譯時不需要知道一維陣列的大小。
我正在使用 minGW GCC 在 windows x64 上進行編譯。
uj5u.com熱心網友回復:
- 我不會做異或魔法
sizeof(A)以位元組為單位給出陣列的大小而不是元素。- 不要用不需要的
#defines替換 C 關鍵字
#include <stdio.h>
void reverse_arr(int *A, size_t N)
{
int *end;
if(A && N)
{
end = A N - 1;
while(end > A)
{
int tmp = *A;
*A = *end;
*end-- = tmp;
}
}
}
void print_array(int A[], size_t N)
{
for(int i = 0; i < N; i )
printf("%d\n", A[i]);
}
int main()
{
int A[5] = {1, 2, 3, 4 ,5};
print_array(A, sizeof(A) / sizeof(*A));
reverse_arr(A, sizeof(A) / sizeof(*A));
print_array(A, sizeof(A) / sizeof(*A));
}
uj5u.com熱心網友回復:
該運算式sizeof(A)產生整個陣列的大小,計算方式如下5 * sizeof( int ),如果sizeof( int )等于4則運算式回傳的值sizeof( A )將等于20。
要確定陣列中元素的數量,您需要使用運算式
sizeof( A ) / sizeof( *A )
雖然為陣列中的元素數量定義一個命名常量會更簡單,例如
int A[] = {1, 2, 3, 4 ,5};
const size_t N = sizeof( A ) / sizeof( *A );
print_array( A, N);
reverse_arr( A, N);
print_array( A, N );
請注意,使用大寫字母來命名識別符號是一個壞主意。通常大寫字母用于命名宏或常量。
還引入了這樣的宏別名
#define procedure void
只會讓代碼的讀者感到困惑。
由于該函式print_array不會更改傳遞的陣列,因此其第一個引數應具有 qualifier const。
此外,該函式的第二個引數具有型別size_twhile 在 for 回圈中的函式內,您正在使用該型別的索引int。
該函式應該被宣告為定義如下方式
void print_array( const int a[], size_t n )
{
for ( size_t i = 0; i < n; i )
printf("%d ", a[i]);
}
呼叫該函式后,您應該列印換行符
putchar( '\n' );
否則所有輸出都將在同一行中。
而不是使用運算子 ^ 來交換整數,而是在引入中間變數時使用通用方法要好得多。這使代碼更具可讀性。讓你的代碼讀者的生活更輕松。:)
reverse_arr可以通過以下方式宣告和定義該函式
void reverse_arr( int a[], size_t n )
{
for ( size_t i = 0; i < n / 2; i )
{
int tmp = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = tmp;
}
}
因此您的程式可以如下所示
#include <stdio.h>
void reverse_arr( int a[], size_t n )
{
for ( size_t i = 0; i < n / 2; i )
{
int tmp = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = tmp;
}
}
void print_array( const int a[], size_t n )
{
for ( size_t i = 0; i < n; i )
printf( "%d ", a[i] );
}
int main( void )
{
int a[] = { 1, 2, 3, 4 ,5 };
const size_t N = sizeof( a ) / sizeof( *a );
print_array( a, N );
putchar( '\n' );
reverse_arr( a, N );
print_array( a, N );
putchar( '\n' );
}
程式輸出是
1 2 3 4 5
5 4 3 2 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366411.html
