0

Why i don't get what i want in line 11 ,23 ,27 in this code ?

https://code.sololearn.com/cV0TA13RRWE4/?ref=app

23rd Mar 2022, 4:01 PM
Abhay mishra
Abhay mishra - avatar
5 Answers
+ 1
11: printf("%d\n", *q); // why not printing 67 . Because in line 7, q = &a[0] + 3. The assignment is the same as q = &a[3], and 56 is in a[3]. (Notice 67 is in a[4]). 23: printf("%d\n", *p); // Why not printing 54 ? Because in line 6, p is initialized to a (a.k.a. &a[0]). Then p is incremented once in line 13 to &a[1] and remains there until line 25. The value in a[1] at first is 11, then it gets incremented four times - twice by line 13, and once each by lines 17 and 19. At line 23, a[1] is 11+1+1+1+1 = 15, so it prints 15. 27: printf("%d\n", *p); // Why not printing -2 ? Because in line 25, p is incremented from &a[1] to &a[2]. The value in a[2] starts as -1 and is never changed.
23rd Mar 2022, 4:49 PM
Brian
Brian - avatar
+ 1
Abhay mishra printf("%d\t%d\t%d\n" , (*p)++ , (*p)++ , *(++p)) ; //this satatement have undefined behaviour it may output in diferent on different compilers 10 11 11 or 11 12 12 or 12 11 11 from left to right or right to left, undefined by statndards so i just taken one expresion to simplyfy understanding.. And taken only printf("%d\n" , *(++p)) ; so output is different than you get.. 11 11 12 But with the your statements, you get 13 13 14 Remaining all same. just look at where pointer locating.. Hope it helps...
23rd Mar 2022, 5:24 PM
Jayakrishna 🇮🇳
+ 1
G'day Brian nicely said. I think the line: printf("%d\n", (*(p++ - 2)) - 1); Post increments p, subtracts 2 from existing location a[1]-2 is a[-1] (out of range but =0), then subtracts 1 from the value. How this code gets allowed to run is the biggest mystery!
23rd Mar 2022, 6:53 PM
HungryTradie
HungryTradie - avatar
+ 1
HungryTradie good analysis! Boundaries are largely ignored in C, as they would be in assembly language. I think of C as an easier way to compose what I would do in assembly. Such gaffes are too easy to make in both assembly and C, which is why Java was invented. Though sometimes flexibility of breaking boundaries is useful and deliberate, which is why C still is around. You have to be careful in C to the utmost!
23rd Mar 2022, 7:32 PM
Brian
Brian - avatar
0
#include<stdio.h> int main(){ int a[] = {10, 11 ,-1 ,56 ,67, 5 ,4} ; int *p , * q ; p = a ; q = &a[0] + 3; //now q points to 4th element 56 printf("%d\n", *q); // output : 56 printf("%d\n" , *(++p)); //your way is 'undefined' so just using one. printf("%d\n", *p); // 11 printf("%d\n",(*p)++); //11 but *p=12 after it printf("%d\n", (*p)++); //12 but *p=13 still p points to 1st location and *p 13 // p+2 points to 4th element 56 so *(p+2) returns 56 and 56-2=54 but pointer not updated its location stil points to *p = 13 printf("%d\n", (*(p + 2)) - 2); // 54 . printf("%d\n", *p); //13 //(p-2) is invalid actually caling a[-1] so it returning 0 and 0-1= -1 but p++ cause to point to next location that is -1 printf("%d\n", (*(p++ - 2)-1)); // p++ cause to pointer increment so now p points to -1 printf("%d\n", *p); // output -1 //post increment first uses its value then increments. **(p+2 != p=p+2) but p++ =>p=p+1 return 0; } //hope it clears.
23rd Mar 2022, 4:44 PM
Jayakrishna 🇮🇳