Question about different ways to declare objects and their effects on RAM usuage

void setup()
{
	Class1 c1;
	Class2 c2;
	Class3 c3;
	c1.init();
	c2.init();
	c3.init();
}

void loop()
{
	ds();
}

This won't work, since the c1, c2, and c3 objects go out of scope when setup() ends and are undefined outside of setup. When you then try to reference them in ds(), you would cause all kinds of grief, but the compiler knows that you can't, because c1, c2, and c3 have scope that does not extend to ds().

	{Class1 c1;c1.init();}

In this case, c1 goes out of scope even sooner. It's scope does not extend to ds().

	{Class1 c1;c1.doSomething();}

Here you are creating a different instance called c1, and calling that instance's doSomething() method. This is not the same instance that was init()ed in setup().