C 增量前/增量后的指针
有人能完整地解释一下下面的代码吗C 增量前/增量后的指针,c,pointers,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)); }
#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;
}
1) 指针“s”如何打印值,其中仅分配了*(a+i)
for循环中的值是多少
2) 分配*(a+i)
时,该值准确地存储在哪里
3) *s++
,(*s++
,*+++s
,++*s
之间有什么区别
4) 为什么当我打印指针a类似于s时,值会增加1
提前感谢!:) 你需要先学习指针。 这可能有帮助:1) 变量
a
和s
指向相同的内存位置
(二)
如果说a+1
,指针a
的值将增加其类型(1*4)的1倍。因此,如果您说*(a+1)
,则从下一个整数中获取值。您可以将变量视为数组,因为它指向大小为4个整数的内存位置。您还可以访问如下值:a[0]、a[1]、a[2]和a[3]
(三)
*s++
:取该指针的值,在该语句之后,指针s
递增4
`(*s)++':获取指针的值,然后将该值增加1
*++s
:将指针s
增加4,然后取其值
++*s
:获取指针s
的值并将其递增1
(四)
由于指针s
和指针a
指向同一个内存位置,并且您调用*s++
,该内存位置的值将增加一个。1和2)指针指向(或者您可以说它是某个内存位置的地址)。因为您分配了a=s=(int*)malloc(4*sizeof(int))
、a
和s
都具有相同的地址,或指向相同的内存位置。如果内存位置的内容发生任何更改(例如,在代码中,您正在为分配的内存分配数字),那么只要您有正确的地址(a
和s
都指向同一位置),您就可以看到内容的更改
一个粗略的类比是,你要一所房子(malloc
),它会还给你房子的地址(A
)。然后你决定房子很丑,你想重新粉刷它(赋值:*(a+i)=i+10
),你告诉地址的其他人(s
)会看到你的房子已经重新粉刷过了
(三)
*s++
表示访问当前地址的内容,然后增加指针(地址)
回到您的代码,它访问第一个元素,然后地址将指向第二个元素
(*s)+
表示访问当前地址的内容,以后增加当前地址的内容
回到您的代码,它在递增第二个元素之前获取该元素的内容。下一个print语句显示已递增的第二个元素的内容
*++s
表示递增当前地址,并在递增的地址访问内容
回到您的代码,它将获得第三个元素的内容
++*s
表示在当前地址增加内容,并访问增加的内容
回到您的代码,它获取第三个元素的递增内容
(四)
正如前面部分所解释的,如果您通过一个指针修改内容,那么如果您有相同的指针(地址),您将看到它。实际上,您正在修改内存地址的内容(如3中所述),因此在重复该过程时,您可能会看到修改的效果
a=s= (int *) malloc(4*sizeof(int));
此语句将内存分配给“s”,并将相同的内存分配给“a”
例如,我会说分配的地址是2000,通常是十六进制,只是为了理解,我会取十进制值。
对于(i=0;i请在提问之前搜索网站。已经有很多问题与基本相同。这些是重要的问题,不应该被否决
a=s= (int *) malloc(4*sizeof(int));
{
*(a+i)=i*10;
printf(" %d ",*(a+i));
}
+--------+---------+----------+---------+
|0 | 10 | 20 | 30 |
| | | | |
+--------+---------+----------+---------+
Address 2000 2004 2008 2012