– Pointer: memory address of a variable
– Address can be used to access/modify a variable from anywhere
– Extremely useful, especially for data structures
– Well known for obfuscating code

Let us begin with a simplified picture of how memory is organized.
– The unary operator & gives the address of an object, so the statement
 p = &c

Physical Memory

Physical resources where data can be stored and accessed by your computer
– cache, RAM, hard disk, removable storage
Physical memory considerations
– Different sizes and access speeds
– Memory management – major function of OS
– Optimization – to ensure your code makes the best use of physical memory available
– OS moves around data in physical memory during execution
– Embedded processors – may be very limited

Virtual Memory

How much physical memory do I have?
– Answer: 2 MB (cache) + 4 GB (RAM) + 1 TB (hard drive) + ...
How much virtual memory do I have?
– Answer: <4 GB (32-bit OS), typically 2 GB for Windows, 3-4 GB for Linux
Virtual memory maps to different parts of physical memory
Usable parts of virtual memory: stack and heap
– stack: where declared variables go
– heap: where dynamic memory goes

Every variable residing in memory has an address!
– register variables
– constants/literals/preprocessor defines
– expressions (unless result is a variable)
How to find an address of a variable? The & operator
 int n= 4; double pi = 3.14159; int *pn = &n;           /* address of integer n */ double *ppi = π    /* address of double pi */

Dereferencing Pointers
I have a pointer – now what?
Accessing/modifying addressed variable: dereferencing/indirection operator *
 /* prints "pi = 3.14159\n " */ printf ( "pi = %g\n" , *ppi ); /* pi now equals 7.14159 */ *ppi = *ppi + *pn ;
Dereferenced pointer like any other variable
null pointer, i.e. 0(NULL): pointer that does not reference anything

Casting Pointers

Can explicitly cast any pointer type to any other pointer type
 ppi =(double *)pn; /* pn originally of type (int *) */
Implicit cast to/from void * also possible
Dereferenced pointer has new type, regardless of real type of data
Possible to cause segmentation faults, other difficult-to-identify errors
– What happens if we dereference ppi now?

 이전페이지 / 2 / 다음페이지