[英]In C programming, I'm trying to print my array in reverse using pointers but I can't seem to get it
[英]Array doesn't print in reverse in C using pointers
我正在嘗試制作一個程序,以10個數字作為輸入,並使用C中的指針以相反的順序輸出它們。
#include<stdio.h>
#define N 10
int array[N]; //Global variable
int main(void) {
int j;
int i;
printf("Enter 10 numbers: ");
for (i=0;i<N;i++) {
scanf("%d",(array+(4*i))); //Works
}
for (j=N-1;j<0;j--) {
printf("%d",array[j]); //Doesn't print, using *(array+j*4) doesn't
//print also
}
printf("\n");
printf("%d\n",*(array)); //Works so scanf works
printf("%d\n",*(array+4)); //Works so scanf works
return 0;
}
我試過為兩個for循環制作一個單獨的函數,但仍然無法正常工作。 我想知道為什么此for循環不會打印,但是會打印下面的兩個printfs。
編輯:
我的新代碼是
#include<stdio.h>
#define N 10
int array[N]; //Global variable
int main(void) {
int j;
int i;
printf("Enter 10 numbers: ");
for (i=0;i<N;i++) {
scanf("%d",(array+i)); //Works
}
for (j=N-1;j<0;j--) { //it is supposed to be j>=0 or j>0 WHY
printf("%d",array[j]); //Doesn't print, using *(array+j) doesn't
//print also
}
printf("\n");
printf("%d\n",*(array)); //Works so scanf works
printf("%d\n",*(array+1)); //Works so scanf works
return 0;
}
多虧了所有這些帖子,我對現在在C中如何使用索引有了更好的了解,但是除非我更改for循環條件(請參見上文),否則printf仍然無法正常工作。 為什么不對初始條件起作用,但對后來的條件起作用。
哇!
這個:
scanf("%d",(array+(4*i))); //Works
是非常錯誤的,正在覆蓋內存! 你為什么要乘索引? 您不需要這樣做,C可以自己編制索引。 應該只是:
scanf("%d", &array[i]);
您需要第i
個數組成員的地址,也就是說,不要用奇怪的乘法來回敲擊灌木叢。
如評論中所述,如果您真的想“使用指針”,可以這樣做:
scanf("%d", array + i);
這是可行的,因為array
是指向array
第一個元素的指針,將i
加到是指針算術的完全有效用法; C將知道數組中每個int
的大小,從而計算出適當的指針。
您的數組由10個類型為int
(顯然)的元素組成。 在表達式array + i
變量中, i
不是字節偏移量。 它是元素的索引。 因此,當您像閱讀( scanf("%d",(array+(4*i)))
)一樣閱讀時,基本上就讀取了array [0],array [4],array [8],array [12](此處已經超出數組范圍,它會導致內存損壞並可能導致崩潰),等等。元素array [1],[2],[3],[5]等尚未初始化。 這就是為什么您的代碼不起作用的原因:)
更新:@ shilong-liu關於數組索引的注釋也很重要。 我沒注意到
for (j=N-1;j<0;j--) {
printf("%d",array[j]); //Doesn't print, using *(array+j*4)
}
for循環不正確。 正確的是
for (j = N - 1; j > 0; j--)
我猜想因為使用的指針是int類型的,所以您假設必須將i
乘以4,因為依賴於編譯器的int是4個字節。 我猜如果您只在乎輸出,那么您可以像使用逆向迭代那樣進行。
其他人已經提到了您必須做的事情,因此我將為您提供實際交換內存明智的解決方案,您可以從給定的解決方案中進行選擇:
#include<stdio.h>
#define N 10
int array[N]; //Global variable
int main(void) {
int j;
int i;
printf("Enter 10 numbers: ");
for (i=0; i<N; i++) {
scanf("%d", (array + i));
}
for (left = 0; left < N / 2; left++)
{
int right = N - left - 1;
int temporary = array[left];
array[left] = array[right];
array[right] = temporary;
}
for (i=0; i<N; i++) {
printf("%d", (array + i));
}
return 0;
}
我一直在為算法競賽編程,所以您可以信任我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.