/*
 * Sonny Rajagopalan
 * CISC181-040, Summer 2006.
 * Funkadelic code for poking around character strings, pointers, arrays and the like.
 */

#include <iostream>
using namespace std;

int main()
{
  char *myNameString="Sonny Rajagopalan";

  cout << endl << "#######################################################" << endl << endl;

  cout << "myNameString is of length " << strlen(myNameString) << " and is " 
       << myNameString << " and &myNameString is " << &myNameString << endl;
  cout << endl << endl;

  for (int i=0; i<strlen(myNameString); i++)
    {
      cout << "[ i=" << i << " ] " << myNameString++ << endl;
      cout << "strlen(myNameString) is now " << strlen(myNameString) << " and myNameString is " << myNameString << endl;
    }

  cout << endl << "(Out of the i loop now) strlen(myNameString) is now " 
       << strlen(myNameString) << " and myNameString is " << myNameString << endl;

  cout << endl << "#######################################################" << endl << endl;

  char *geniusName="Howard Hughes";

  for (int i=0; i<strlen(geniusName); i++)
    {
      cout << "geniusName[" << i << "] = " << geniusName[i] << endl;
    }  

  cout << endl << "#######################################################" << endl << endl;

  for (int i=0; i<strlen(geniusName); i++)
    {
      cout << "*(geniusName+" << i << ") = " << *(geniusName+i) << endl;
    }  

  cout << endl << "#######################################################" << endl << endl;

  char arrayOfChars[10]={'a','b','c','d','e','f','g','h','i','j'};

  /* 
   *  Hmmm. What is the following all about? Why does whatever that print out print out?
   *  It's because "cout" likes to think *any* character array is in fact a null
   *  terminated string, and likes to display it like so.
   */

  cout << "arrayOfChars = " << arrayOfChars << endl;
  cout << "arrayOfChars (as an int) = " << (int) arrayOfChars << endl;

  /* 
   * It's all about how you choose to "see" your data :-)
   */

  cout << "\tand &arrayOfChars = " << &arrayOfChars << endl;
  cout << "\tand *arrayOfChars = " << *arrayOfChars << endl;

  cout << endl << "#######################################################" << endl << endl;

  for (int i=0; i<10; i++)
    {
      cout << "*(arrayOfChars+" << i << ") = " << *(arrayOfChars+i) << endl;
    }

  cout << endl << "#######################################################" << endl << endl;

  int myIntArray[7]={1, 2, 3, 4, 5, 6, 7};

  cout << "myIntArray is " << myIntArray << " and &myIntArray is " << &myIntArray << endl;

  for (int i=0; i<7; i++)
    {
      cout << "*(myIntArray+" << i << ") = " << *(myIntArray+i) << endl;      
    }

}
