i have assigned a value directly to a pointer like *ptr=12; and i have used it,no error came.if we assign like this where the pointer points to?explain me?

Are you doing this in an initialization context? Because if you do something like the following declaration:

int *ptr = 12;

It probably will not error, but instead make ptr point to the (probably invalid) memory location of 12. Otherwise, I'm absolutely baffled that no error occured.

Otherwise, I'm absolutely baffled that no error occured.

It depends on the compiler. Modern compilers should error out if you don't properly cast the literal:

int *ptr = (int*)12;

I wouldn't be surprised if Turbo C allowed it without the cast. However, it's generally a bad idea to set the address of pointer from a literal. The situations where you even can do it successfully are few and far between. Most of the time you'll just get a runtime error.

Edited 3 Years Ago by deceptikon

Modern compilers should error out if you don't properly cast the literal:

I was under the impression that whether or not you had to cast the literal depended on whether you were using C or C++. Has something changed in C11 that I'm not aware of?

To add to what has been said, I see this most commonly when writing code for embedded hardware, in which some physical real world sensor or signaller is permanently linked to a specific memory address. For example, if you look in the manual for your embedded hardware and see that the signalling LED will be ON when a byte at memory location 0xBAADF00D is non-zero, you might expect to do something like this:

char* LEDState = (char*)0xBAADF00D;

and use that pointer to control the state of the LED.

If you need to do something like this, you will know! The manual for your hardware will make it very clear.

It was also used in the 1980s/1990s with MS-DOS 6.X and earlier to write directly to the screen, or to write directly to a port such as serial and parallel ports. Ahh, those were the good old days when Turbo C was king of the compilers.

This article has been dead for over six months. Start a new discussion instead.