Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有前后增量的C指针行为_C_Pointers - Fatal编程技术网

具有前后增量的C指针行为

具有前后增量的C指针行为,c,pointers,C,Pointers,我在做一些C指针的实验,试图了解它的行为。以下是我对以下代码的假设。如果我错了,请纠正我。 我有以下代码: int n[5] = {3,6,9,12,15}; int *ptr = n; ptr++; printf("%d", *ptr); //Needless to say, the output will be 6 我的假设:上面的输出是6,因为ptr++意味着ptr=ptr+1,我正在更改ptr的值,它是n[0]的地址 现在我们来看一下以下场景: int n[5] = {3,6

我在做一些C指针的实验,试图了解它的行为。以下是我对以下代码的假设。如果我错了,请纠正我。 我有以下代码:

int n[5] = {3,6,9,12,15};   
int *ptr = n;
ptr++;

printf("%d", *ptr);  //Needless to say, the output will be 6
我的假设:上面的输出是6,因为ptr++意味着ptr=ptr+1,我正在更改ptr的值,它是n[0]的地址

现在我们来看一下以下场景:

int n[5] = {3,6,9,12,15};   
int *ptr = n;
*ptr++;

printf("%d", *ptr);  //Why is the output still 6?
我的问题是:我们如何解释*ptr++?这是否意味着:

*ptr=*ptr+1或 *ptr=ptr+1或 ptr=ptr+1还是什么? 顺便说一下,当我打印出n的值时,它仍然是3,6,9,12,15

对不起,第二个问题:


那么我们应该如何解释*++ptr和+++*ptr呢?

这是由于C中的运算符优先级。下面的链接可能会帮助您

递增或递减运算符的优先级高于取消引用运算符

*ptr++; is similar to *(ptr++)

在第一种情况下,ptr++和*ptr++返回ptr指向的上一个地址,在第二种情况下,返回该地址的值后,指针递增。你没有对结果做任何事情,所以你看不到区别

*++ptr将首先递增ptr,然后返回它现在指向的值


++*ptr将获取ptr指向的值,将其递增,然后返回。

因为运算符优先级*pt++;与*ptr++相同;因此,它会递增指针,然后取消引用指针,而不执行任何操作。

请查看下面的链接:

为了理解这里发生的事情,您需要了解运算符优先级

++运算符的优先级高于*

表达式

*ptr++;
有价值

*ptr
在增加ptr之前,然后ptr是增量本身。写作没有意义

*ptr++;
因为不使用在ptr递增之前为*ptr的表达式值。所以事实上这些表达式的结果

ptr++;

是一样的

对于表达式*++ptr和+++*ptr,则在该表达式中,第一个ptr处的*++ptr递增,即它将指向数组的第二个元素,然后取消引用,其值是第二个元素的值。
在这个表达式中+++*ptr首先返回数组第一个元素的值,即3,然后该值递增,得到4。

优先级也取决于编译器。它可能会根据编译器的不同而变化。最好使用括号来确保输出

第二个代码应该给您一个警告,不要使用计算值或类似的值:在增加p之前取消对p的引用,但不要对取消引用的值执行任何操作。如果要输入指向的值,请使用*ptr++。如果不清楚先执行哪个操作,使用括号将其显式显示。@Jack的可能副本您粘贴的链接在没有很多人回答他的问题的情况下收到了很多反对票。@user3437460它实际上只需要一个正确的答案,并且已经给出了。在*ptr++中,它与*ptr++相同吗?需要对此进行确认。@user3437460:是的,这两个答案是等效的。谢谢你的回答,我正在寻找一个类似于你的答案,可以解释各种情况+1.否++运算符的优先级仅高于*运算符(如果是后缀增量)。如果++运算符是前缀增量,则其优先级与*运算符相同。
*ptr++;