我正在尝试创建一个以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循环不打印,但它下面的两个printf打印。
编辑:
我的新代码是
#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仍然不能正常工作(见上文)。为什么它不适用于初始条件,但适用于后者条件。
答案 0 :(得分:8)
哇!
此:
scanf("%d",(array+(4*i))); //Works
非常错误,正在覆盖内存!你为什么要乘以索引?你不需要这样做,C可以自己编制索引。它应该只是:
scanf("%d", &array[i]);
你想要i
:数组成员的地址,所以说,不要用奇怪的乘法来绕过丛林。
如果您真的想要“使用指针”,如评论中所述,您可以这样做:
scanf("%d", array + i);
这是有效的,因为array
是指向数组的第一个元素的指针,并且添加i
是指针运算的完全有效使用; C将计算正确的指针,知道数组中每个int
的大小。
答案 1 :(得分:2)
您的数组包含10个类型为int
的元素(显然)。在表达式array + i
中,变量i
不是以字节为单位的偏移量。它是元素的索引。所以,当你像你一样阅读它(scanf("%d",(array+(4*i)))
)时,你基本上读取了数组[0],数组[4],数组[8],数组[12](我们已经没有数组边界了,它会导致内存损坏并可能导致崩溃)等。元素数组[1],[2],[3],[5]等未初始化。这就是你的代码无效的原因:)
更新: @ shilong-liu关于数组索引的注释也很重要。我没注意到它。
答案 2 :(得分:1)
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--)
答案 3 :(得分:0)
我猜因为使用的指针是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;
}
我一直在为算法竞赛编程,所以你可以相信我。