任何人都可以完整地解释以下代码吗?
#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?
提前致谢! :)
答案 0 :(得分:2)
1和2)指针指向(或者您可以说它是某个存储位置的地址)。由于您分配a = s = (int*) malloc(4 * sizeof(int));
,a
和s
都具有相同的地址,或指向相同的内存位置。如果内存位置的内容发生了任何变化(例如,在您的代码中,您正在为分配的内存分配数字),那么只要您拥有正确的地址(a
和s
指向同一位置),您可以看到内容更改。
粗略的比喻是,你要求一所房子(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)
变量a
和s
指向相同的内存位置。
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