My distinction would go something like this.
1. Beginner.
Code is all in one file. Syntax is "OK" but not great. There are either too few or too many comments everywhere. Functions aren't descriptive of what they do, error checking is very weak to non-existent.
2. Intermediate
Modular files are taking root. Syntax is near perfect. Comments are near perfect. The developer is mostly concerned with learning new libraries and APIs and not so much what an API is. They might be able to work on a team of developers, then again, they might not. Concepts of OOP should be down pat. Should understand some of the basics of whats going on behind compiling.
3. Advanced.
As Crusty said, they should have a good understanding of advanced concepts and be able to implement them (Multithreading ect). They should be able to contribute to most major open source projects out there it a helpful way. They know how to debug their code. When they program, it is usually pretty optimal, however they know when to optimize and when to simplify.
Advanced should have a good knowledge of 1 or more OS's of their choice (like windows or linux) and how to make application specific programs for both. They will know some ASM for those delicate math operations that they sometimes have to do. Advanced has pretty good knowledge of their compiling environment. They know of specific bugs and work arounds for them.
The advanced programmer knows how to design good code, optimize it, and fix major bugs. They write code that is easily maintainable by anyone and yet very elegant in its own regard, these are the people that truly understand the art of programming.
By those measurements I place myself at intermediate starting towards advanced.
By what you have said, it sounds like you have basic concepts down. I would place you (totally arbitrarily, I really don't know where you are at and you very well could be higher) at a late stage beginner to early stage intermediate. The reason for that is because you mention pretty basic concepts as your qualification.