Question about char array

the '&' in its usage there returns the address of the variable:
however your version is wrong ( for memset ):

&Str1;

The correct usage for the memset function is similar to this:

&Str1[10];

Str1 is an array, so without indirection '[]' its a pointer to the start of the array, so you can just write:

memset(Str1, 0, sizeof(Str1));

which is equivalent to:

memset( &Str1[0], 0, sizeof(Str1));

Also moving the starting pointer is simple:

char *Str3 = &Str1[10]; //This simply gets the 11'th char in str1, then returns the address of it.
//which is the same as:

char *Str3 = ( Str1 + 10 );

This is all different to using the '&' symbol to denote references or bitwise AND.
i.e

//Reference var
int &i_Ref = somevar;

//Parameters by reference
void Func( int &i_RefParam );

//Bit wise
if( a & B ){}