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