# (Number Sign) is ASCII code point 35 (0x23), Unicode U+0023, and a printable punctuation character. It marks a number when placed before digits — #7 means "number seven" — though Americans increasingly call it "hashtag" and the British have always known it as "hash." Few characters pull as much weight across languages. C and C++ use #include and #define for preprocessor directives, Python marks comments with it, and Markdown leans on it for headings. In URLs, everything after a # is a fragment identifier that the browser handles client-side — the server never sees it. CSS uses it to target element IDs (#nav) and to specify hex colors (#ff0000). That overlap is harmless until you try to link to a page section whose ID starts with a digit: #3results is a valid fragment but an invalid CSS selector, and JavaScript's document.querySelector("#3results") throws instead of returning null. The symbol traces back to "lb" (Latin libra pondo), gradually compressed by hurried scribes until the letters fused into the crosshatched glyph we recognize today. UTF-8 encodes it as a single byte 0x23. Unicode classifies it as Po (Punctuation, Other) with the name NUMBER SIGN. It is visually close to the musical sharp ♯ (U+266F), which has vertical strokes and slanted horizontals — the exact inverse of #.
#define FLAG "#enabled" // Preprocessor uses '#'const char *s = FLAG; // Expands at compile time// Often used for feature flags and build-time config
All of the above, depending on context. 'Number sign' is the official Unicode name. 'Hash' dominates in programming (hashmap, hash function). 'Pound' is North American telephone usage. 'Hashtag' came from Twitter in 2007. 'Octothorpe' is the obscure telecom name from the 1960s.
Because it was one of the few non-alphanumeric characters on early keyboards. Different communities adopted it independently: comments in Python/Shell, hex colors in CSS (#FF0000), headers in Markdown, preprocessor directives in C (#include), and anchors in URLs (fragment identifiers).
The #! at the start of a script tells Unix which interpreter to use (e.g., #!/usr/bin/env python3). The kernel reads these two bytes, finds the interpreter path, and executes the script through it. Without a shebang, the shell tries to interpret the file itself.
The # introduces a fragment identifier — it tells the browser to scroll to an element with that ID (e.g., page.html#section2). Everything after # is never sent to the server, which is why single-page apps use hash routing for client-side navigation.