指针前/后递增

时间:2012-06-11 06:37:31

标签: c pointers

任何人都可以完整地解释以下代码吗?

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

int main()
{
    int *a, *s, i;

    a = s = (int *) malloc(4 * sizeof(int));

    for (i = 0; i < 4; i++)
    {
        *(a + i) = i * 10;
        printf(" %d ", *(a + i));
    }

    printf("\n");
    printf("%d\n", *s++);
    printf("%d\n", (*s)++);
    printf("%d\n", *s);
    printf("%d\n", *++s);
    printf("%d\n", ++*s);
    printf("\n");
    printf("%d\n", *a++);
    printf("%d\n", (*a)++);
    printf("%d\n", *a);
    printf("%d\n", *++a);
    printf("%d\n", ++*a);

    return 0;
}

输出:

0 10 20 30
0
10
11
20
21

0 
11
12
21
22

1)指针''如何打印值,仅指定了*(a+i)       for循环中的值?

2)在分配*(a+i)时,值准确地存储在哪里并存储?

3)*s++(*s)++*++s++*s之间有什么区别?

4)当我打印类似于s的指针时,为什么值会增加1?

提前致谢! :)

4 个答案:

答案 0 :(得分:2)

1和2)指针指向(或者您可以说它是某个存储位置的地址)。由于您分配a = s = (int*) malloc(4 * sizeof(int));as都具有相同的地址,或指向相同的内存位置。如果内存位置的内容发生了任何变化(例如,在您的代码中,您正在为分配的内存分配数字),那么只要您拥有正确的地址(as指向同一位置),您可以看到内容更改。

粗略的比喻是,你要求一所房子(malloc),它会给你一个房子的地址(a)。然后你决定房子是丑陋的,你想重新绘制它(指定值:*(a + i) = i + 10),你告诉地址的其他人(s)会看到你的房子已经重新绘制。

3)

*s++表示访问当前地址的内容,稍后会增加指针(地址)。

回到你的代码,它访问第一个元素,然后地址将指向第二个元素。

(*s)++表示访问当前地址的内容,稍后会增加当前地址的内容

回到你的代码,它会在递增之前获取第二个元素的内容。下一个print语句显示第二个元素的内容已递增。

*++s表示递增当前地址,并以递增地址访问内容。

回到你的代码,它获取第三个元素的内容。

++*s表示增加当前地址的内容,并访问增量内容。

回到你的代码,它获得第三个元素的递增内容。

4) 如前面部分所述,如果您通过一个指针修改内容,如果您有相同的指针(地址),您将看到它。您实际上正在修改内存地址的内容(如3中所述),因此您可能会在重复此过程时看到修改的效果。

答案 1 :(得分:1)

你需要先学习指针。 可能会有所帮助:http://www.cs.cf.ac.uk/Dave/C/node10.html

答案 2 :(得分:0)

1)

变量as指向相同的内存位置。

2)

如果您说a + 1,则将指针a的值增加1倍于其类型(1 * 4)的大小。因此,如果您说*(a+1),则从下一个整数中获取值。您可以将变量视为数组,因为它指向大小为4的整数的内存位置。您还可以访问以下值:a[0], a[1], a[2] and a[3]

3)

*s++:你获取该指针的值,在该语句之后,指针s增加4。

`(* s)++':你取指针的值,然后将该值递增1。

*++s:将指针s递增4,然后取值。

++*s:您获取指针s的值并将其递增1。

4)

由于指针s和指针a指向相同的内存位置,并且您调用*s++,因此内存位置的值增加了之一。

答案 3 :(得分:0)

a=s= (int *) malloc(4*sizeof(int)); 

此语句将内存分配给's',同一内存分配给'a' 例如,我将分配的地址是2000,通常它将是十六进制只是为了理解我将取十进制值。      对于(I = 0; I&LT; 4;我++)

 {

  *(a+i)=i*10;

 printf(" %d ",*(a+i));

   }

当你做(a + i)时,地址加上i .... a + 0 = 2000(例如) a + 1 = 2004(下一个内存位置),因为a是int指针,它将增加4(int的大小)

         +--------+---------+----------+---------+
         |0       |   10    |     20   |    30   |
         |        |         |          |         |
         +--------+---------+----------+---------+
 Address 2000     2004      2008       2012

*(a + i)只给你内存位置的内容(a + i)或者给你一个地址 因为你为两者分配s具有相同的值 所以现在* s ++现在s是2000 * s是0并且s ++发生在下次使用s它将在2004年位置所以它的0 next ur * s是10和(* s)++ wil post increment 10 so so next 11 next use

查看优先级和关联性以了解它是如何编译的

http://msdn.microsoft.com/en-us/library/126fe14k%28v=vs.80%29.aspx