関数が長くなったり、処理が複雑になってきたときに
int i; /* i を外で宣言したら */
for (i = 0...

i = 5; /* ループカウンタ以外で i を使ったりすると管理が面倒 */

string::iterator i; /* 同じ識別子を宣言できない */

とかの状況を回避する。
要するにコードの保守性を上げるため。
グローバル変数多用しない、とかも同じ理由。