2012-06-11 112 views
-2

任何人都可以请完整解释下面的代码吗?指针前/后增量

#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)被分配在 的值循环?

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

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

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

在此先感谢! :)

+1

需要'家庭作业'标签吗? –

+1

请在询问之前搜索网站。基本上同样的问题已经有很多问题了。 –

+0

这些都是重要的问题,不应该被拒之门外 –

回答

0

1)

变量as都指向同一个内存位置。

2)

如果你说a + 1,可以通过它的类型的大小1次递增指针a的值(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。

2

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

一个粗略的比喻是,你问房子(malloc),它会给你回房子的地址(a)。然后你决定房子很丑,并且你想重画它(分配值:*(a + i) = i + 10),你告诉地址(s)的其他人会看到你的房子已经被重新粉刷过。

3)

*s++指在当前地址访问内容,并后来递增指针(地址)。

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

(*s)++指在当前地址访问内容,并后来递增在当前地址内容

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

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

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

++*s意味着增量在当前地址内容,并访问递增内容。

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

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

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

这种说法分配内存以“S” ANS相同的内存被分配到“A” 例如我西港岛线的故事分配的地址是2000通常这将是十六进制只是为了了解我将采取十进制值。 为(I = 0;我< 4;我++)

{ 

    *(a+i)=i*10; 

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

    } 
的地址被添加以i

当u做(A + I)....一个+ 0 = 2000(根据实施例) 一个+ 1 = 2004(下一个存储位置),因为一个被INT指针它将由4(INT的大小)

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

*(A + I)WIL递增给你的内存位置的内容只有(a + i)或者给你的地址 ,因为如果你将s分配给两者都具有相同的值 那么现在* s ++现在s是2000 * s是0并且s ++发生在下一个使用S的将是在2004年的位置,以便其0 下一回合* s为10(* S)++ WIL后递增10所以它的11下次使用

看到的优先级和结合到知道它是如何编译

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