1. Pointers and Addresses
 
Pointers and Addresses
 
Pointers and Addresses
– 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
 
Abstraction by OS, addressable space accessible by your code
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
 
Addressing Variables
 
Every variable residing in memory has an address!
What doesn’t have 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 = &pi;    /* 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 / 다음페이지