-3

谁能完整解释以下代码?

#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)指针's'如何打印值,*(a+i)仅在for循环中分配值?

2) 赋值时值在哪里准确存储和存储*(a+i)

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

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

提前致谢 !:)

4

4 回答 4

2

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

一个粗略的类比是,你要一个房子(malloc),它会给你房子的地址(a)。然后你决定房子很丑,你想重新粉刷它(赋值:)*(a + i) = i + 10,你告诉地址的其他人(s)会看到你的房子已经粉刷了。

3)

*s++表示访问当前地址的内容,然后递增指针地址)。

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

(*s)++表示访问当前地址处的内容,然后递增当前地址处的内容

回想一下您的代码,它会在增加第二个元素之前获取它的内容。下一个打印语句显示第二个元素的内容已增加。

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

回想你的代码,它得到了第三个元素的内容。

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

回想一下您的代码,它会获取第三个元素的增量内容。

4) As explained in earlier part, if you modify the content via one pointer, you will see it if you have the same pointer (address). You are actually modifying the content of the memory addresses (as explained in 3), so you may see the effect of modification when you repeat the process.

于 2012-06-11T06:59:49.960 回答
1

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

于 2012-06-11T06:47:39.950 回答
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++,该内存位置的值增加了 1。

于 2012-06-11T06:55:58.610 回答
0
a=s= (int *) malloc(4*sizeof(int)); 

该语句将内存分配给's',因为相同的内存分配给'a',例如,我将分配的地址是2000,通常它是十六进制的,只是为了理解我将采用十进制值。for(i=0;i<4;i++)

 {

  *(a+i)=i*10;

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

   }

当你做 (a+i) 地址加上 i....整数)

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

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

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

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

于 2012-06-11T07:22:26.427 回答