We can see with examples below that myString[0] == *myString == *(&myString[0]) == H.
Why?
Because myString[0] points the first character of the string "Hello World", in this case "H".
Same for *myString that is the value of the first character of the string. Finally &myString[0] is the address of the first character (H), and with the * before we retrieve the value of this address, in this case "H".
Let's take some examples of pointers in C:
#include <stdio.h> int main() { char *myString; int myInt; int *p_myInt; printf("\nLet's start!\n"); printf("\nDeclaration of myInt, p_myInt and myString.\n\n"); printf("Value of p_myInt = %d.\n", p_myInt); printf("Value of *p_myInt = %d.\n", *p_myInt); printf("Value of myString = %s.\n", myString); printf("\nAddress of p_myInt = %p.\n", p_myInt); printf("Address of *p_myInt = %p.\n", *p_myInt); printf("Address of myString = %p.\n", myString); printf("\nInitialisation of myInt, p_myInt and myString.\n\n"); myInt = 53; p_myInt = &myInt; myString = "Hello World Pointers!"; printf("Value of myInt = %d.\n", myInt); printf("Value of *p_myInt = %d.\n", *p_myInt); printf("Value of *(&myInt) = %d.\n", *(&myInt)); printf("Value of p_myInt = %d.\n", p_myInt); printf("\nAddress of &myInt = %p.\n", &myInt); printf("Address of p_myInt = %p.\n", p_myInt); printf("Address of *p_myInt = %p.\n\n", *p_myInt); printf("Value of myString = %s.\n\n", myString); printf("Character myString[0] = %c.\n", myString[0]); printf("Character *myString = %c.\n", *myString); printf("Character myString = %c.\n", myString); printf("Character &myString[0] = %c.\n", &myString[0]); printf("Character *(&myString[0]) = %c.\n", *(&myString[0])); printf("Character myString[1] = %c.\n", myString[1]); printf("Character *(myString + 1) = %c.\n", *(myString + 1)); printf("Character *(&myString[1]) = %c.\n\n", *(&myString[1])); printf("Address of myString[0] = %p.\n", myString[0]); printf("Address of *myString = %p.\n", *myString); printf("Address of myString = %p.\n", myString); printf("Address of &myString[0] = %p.\n", &myString[0]); printf("Address of myString + 1 = %p.\n", myString + 1); printf("Address of &myString[1] = %p.\n", &myString[1]); printf("Address of &myString = %p.\n\n", &myString); return (0); }
Result:
Let's start! Declaration of myInt, p_myInt and myString. Value of p_myInt = 4382708. Value of *p_myInt = 4382076. Value of myString = �Õ. Address of p_myInt = 0x42dff4. Address of *p_myInt = 0x42dd7c. Address of myString = 0x804870b. Initialisation of myInt, p_myInt and myString. Value of myInt = 53. Value of *p_myInt = 53. Value of *(&myInt) = 53. Value of p_myInt = -1078787292. Address of &myInt = 0xbfb30324. Address of p_myInt = 0xbfb30324. Address of *p_myInt = 0x35. Value of myString = Hello World Pointers!. Character myString[0] = H. Character *myString = H. Character myString = �. Character &myString[0] = �. Character *(&myString[0]) = H. Character myString[1] = e. Character *(myString + 1) = e. Character *(&myString[1]) = e. Address of myString[0] = 0x48. Address of *myString = 0x48. Address of myString = 0x80488c1. Address of &myString[0] = 0x80488c1. Address of myString + 1 = 0x80488c2. Address of &myString[1] = 0x80488c2. Address of &myString = 0xbfb30328.
Add new comment