7
#include <stdlib.h>
#include <stdio.h>

int main (void)
{
    int a[] = {1,2,3,4,5};
    int b[] = {0,0,0,0,0};
    int *p = b;

    for (int i =0; i < 5; i++)
    {
        b[i] = a[i]+1;
        *p = a[i]+1;
        p++;
    }
    for (int i = 0; i < 5; i++)
    {
        printf (" %i \t %i \t %i \n", *p++, b[i], a[i]);
    }
    return 0;
}

对于这段代码,我知道为什么 a 和 b 的输出,但为什么指针具有相同的 a 值?

*p 是 b[0] = a[0]+1,不是吗?所以 p++ 意味着 b 的下一个地址,所以它是 b[1]=a[1]+1。

ie 
*p  b  a
1  2  1
2  3  2
3  4  3
4  5  4
5  6  5
4

4 回答 4

9

你得到未定义的行为。在第一个循环的末尾p指向b. 在不重置它的情况下,您可以取消引用它并继续增加它,这两者都会导致未定义的行为

可能是在您的实现中,数组在aarray 之后立即存储b并且p已经开始指向 array a。这将是一种可能的“未定义”行为。

于 2013-03-05T13:24:50.033 回答
1

在第一个for{}之后,p指向b[5],但是b的大小是5,所以b[5]的值是未知的,printf *p和a[i]的值一样,原因可能是在内存中 b[5] 是 a[0]。

于 2013-03-05T14:46:37.350 回答
1

我认为你需要做的是添加一个p = p - 5;

#include <stdio.h>
int main (void)
{
    int a[] = {1,2,3,4,5};
    int b[] = {0,0,0,0,0};
    int *p = b;
       int i =0;

    for (i =0; i < 5; i++)
    {
        b[i] = a[i]+1;
        *p = a[i]+1;
        p++;
    }
    p = p - 5;
    for (i = 0; i < 5; i++)
    {
        printf (" %i \t %i \t %i \n", *p++, b[i], a[i]);
    }
    return 0;
}
于 2013-07-12T06:07:16.653 回答
-2

您不应该为打印和递增数组的值创建单独的循环。在同一个循环中执行并执行以下操作以获得您的输出:) #include #include

int main(void)
{

int a[]={1,2,3,4,5};
int b[]={0,0,0,0,0};
int c[]={0,0,0,0,0};
int *p;
int i;
p=c;
for( i =0 ; i<5 ; i++)
{
    b[i]=a[i]+1;
    *p=b[i]-1;
    //*p++;

//for( i =0 ; i<5 ; i++)

    printf(" %i \t %i \t %i \n" ,*p,b[i],a[i]);

}
return 0;
}
于 2013-03-05T14:44:16.820 回答