Ask your own question, for FREE!
Computer Science 13 Online
OpenStudy (anonymous):

main() { char *s[] = { "apple","mango","berry","cherry"}; printf("%c\n",*(s+2)); printf("%c\n",( *s+2)); } i tried this program and i got some un xpected results.... u ppl can find an xplanation for this?

OpenStudy (konradzuse):

well 1 not too sure what the * is doing there, also when dealing with an array you want to use the s[] not s... FOr example s[0] is apple, s[1] is mango etc.....

OpenStudy (rsmith6559):

The first printf looks to dereference s+2, the second looks like it dereferences s and adds 2 to it.

OpenStudy (anonymous):

@rsmith6559 sir please try compiling it ....it was not that easy

OpenStudy (anonymous):

Since you have defined s as a pointer to a character array (char **), dereferencing s will give you the pointer to a string (like e.g. 0x400624). Since you said you want to print this value as a character (since you use '%c' in printf), these addresses are somehow translated into characters. I don't know how that translation is done, but it could result in printing some weird characters on your screen.

OpenStudy (anonymous):

no i dont think so....coz we all get the same result... i mean we all got a star....so it cant be a random adrees in RAM

OpenStudy (anonymous):

I did not get a star, but a 0 and an &. During compilation, the compiler will put those constant strings somewhere in the executable (if you're on Linux, try string <executable> to find such strings). Those addresses are therefor fixed once you compiled the code, so you will see the same symbol each time you run that executable.

OpenStudy (anonymous):

ohh ok wait lemme run on linux an @slotema plz do wait i have another query

OpenStudy (anonymous):

ok fine my next one

OpenStudy (anonymous):

#include<iostream> int main() { int x[3][5]={ {18,20,13,24,35}, {7,8,6,9,10},{19,22,30,21,15}} ; int *n=&x[0][0]; std::cout<<"endl:- "<<(*(n+3)+1) <<":"<<*(*x+2)+5<<"\n"; std::cout<<"endl:- "<<*(*(x+2)+1) <<":"<<*(x[1]+2)+5; } u have amy idea how that *(n+3)+1 works?

OpenStudy (anonymous):

*any

OpenStudy (anonymous):

int main() { int x[3][5]={ {18,20,13,24,35}, {7,8,6,9,10},{19,22,30,21,15}} ; int *n=&x[0][0]; std::cout<<"endl:- "<<(*(n+3)+1) <<":"<<*(*x+2)+5<<"\n"; std::cout<<"endl:- "<<*(*(x+2)+1) <<":"<<*(x[1]+2)+5; }

OpenStudy (anonymous):

So n points to the first element from x (which is 18). *(n+3) take the fourth (n, n+1, n+2, n+3) element in the array (which is 24). That 24 is than incremented by 1.

OpenStudy (anonymous):

i thot it's a 2-d array so incrementin n by 3 shud make it point to the 3-row instead?

OpenStudy (anonymous):

if you want it to act as a 2-D array, you should change the definition of n. Right now, n is just an int *, so it acts as a 1-D array.

OpenStudy (anonymous):

so if i make it like int ** it's gonna change it's behavior?

OpenStudy (anonymous):

so what if n is an int ** i got smthn like 12

OpenStudy (anonymous):

It a bit more complicated than that. If you want to use a pointer as a 2-D array, the compiler should know the size of the second dimension. Only if that size is known, the compiler will know what do with a statement like n+1. Therefor, you should define n as `int (*n)[5]` (post #6 in http://devmaster.net/forums/topic/12966-how-to-create-a-pointer-to-2d-array-in-c/page__view__findpost__p__69890).

OpenStudy (anonymous):

it's about making an array of pointers r8? i was trying to work on pointer arithmetic

OpenStudy (anonymous):

what's if i declare a double pointer say t int **t=&x[0][0]; and now i d like to use (*(t+3)+1) i expected a segmentation fault but i dint get it *(*(t+3)+1) gives me a segmentation fault....i convinced my self saying that ther's no x[3][1]; am i right?

OpenStudy (anonymous):

There is indeed no x[3][*]. Try with 0, 1 or 2. I can't get the int ** pointer to compile properly without any errors. The solution in my previous post works for me.

OpenStudy (anonymous):

did u try this (*(t+3)+1) i got a warning but i got a value 39

OpenStudy (anonymous):

My problem is that my compiler (GCC-4.7) won't accept `int **t = &x[0][0];` But as long as it works for you, that's the most important thing.

OpenStudy (anonymous):

it wont? :-/ but i want an xplanation :(

OpenStudy (anonymous):

i got a 4.6.3

OpenStudy (anonymous):

Did you already try changing the 3 into 2 for `*(*(t+3)+1)`?

OpenStudy (anonymous):

no a min

OpenStudy (anonymous):

ops sory i got a 39 for (*(t+2)+1) abd 12 for (*(t+3)+1)

OpenStudy (anonymous):

The thing with `(*(t+2)+1)` is that you're derefencing t once. Whatever you print is not the value of the array, but again a pointer to the array. Try dereferencing the whole thing.

OpenStudy (anonymous):

that gives a segmentation fault

OpenStudy (anonymous):

may be it's linearly accesing the array on memory now taking sizeof(t) and traversing over?

OpenStudy (anonymous):

My guess is that it's somehow due to the fact that the compiler does not know what to do with a t+1. How many bytes would it skip? Try the approach I mentioned earlier (int (*t)[5]).

OpenStudy (anonymous):

i kno that would work it's simply creating an array of pointer and storing the address of beginning of row in that array i jus wanna jus more on pointer arithmetic it kinda confuses me everytime

Can't find your answer? Make a FREE account and ask your own questions, OR help others and earn volunteer hours!

Join our real-time social learning platform and learn together with your friends!
Can't find your answer? Make a FREE account and ask your own questions, OR help others and earn volunteer hours!

Join our real-time social learning platform and learn together with your friends!