0% found this document useful (0 votes)
110 views16 pages

C Pointers: (Reek, Ch. 6)

1. A pointer is a variable that holds the memory address of another variable. Pointers allow access and manipulation of data in memory. 2. Uninitialized pointers contain arbitrary "garbage" values that may point to invalid or restricted memory locations, potentially causing program errors. It is important to initialize pointers before use. 3. The indirection operator * and address operator & allow accessing the contents or address of the memory pointed to by a pointer. Pointer arithmetic and increment/decrement operators allow treating pointers like arrays to access successive memory locations.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
110 views16 pages

C Pointers: (Reek, Ch. 6)

1. A pointer is a variable that holds the memory address of another variable. Pointers allow access and manipulation of data in memory. 2. Uninitialized pointers contain arbitrary "garbage" values that may point to invalid or restricted memory locations, potentially causing program errors. It is important to initialize pointers before use. 3. The indirection operator * and address operator & allow accessing the contents or address of the memory pointed to by a pointer. Pointer arithmetic and increment/decrement operators allow treating pointers like arrays to access successive memory locations.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 16

C pointers

(Reek, Ch. 6)

1 CS 3090: Safety Critical Programming in C


Review of pointers
 A pointer is just a memory location.
 A memory location is simply an integer value, that we
interpret as an address in memory.
 The contents at a particular memory location are just a
collection of bits – there’s nothing special about them that
makes them ints, chars, etc.
 How you want to interpret the bits is up to you.

 Is this... an int value? 0xfe4a10c5

... a pointer to a memory address?


... a series of char values?

2 CS 3090: Safety Critical Programming in C


Review of pointer variables
 A pointer variable is just a variable, that contains a value
that we interpret as a memory address.
 Just like an uninitialized int variable holds some arbitrary
“garbage” value,
an uninitialized pointer variable points to some arbitrary
“garbage address”

char *m;

(char *)

3 CS 3090: Safety Critical Programming in C


Following a “garbage” pointer
 What will happen? Depends on what the arbitrary
memory address is:
 If it’s an address to memory that the OS has not allocated to our
program, we get a segmentation fault
 If it’s a nonexistent address, we get a bus error
 Some systems require multibyte data items, like ints, to be
aligned: for instance, an int may have to start at an even-
numbered address, or an address that’s a multiple of 4. If our
access violates a restriction like this, we get a bus error
 If we’re really unlucky, we’ll access memory that is allocated
for our program –
We can then proceed to destroy our own data!

4 CS 3090: Safety Critical Programming in C


How can you test whether a pointer points
to something meaningful?
 There is a special pointer value NULL, that signifies
“pointing to nothing”. You can also use the value 0.

char *m = NULL;
...
if (m) { ... safe to follow the pointer ... }

 Here, m is used as a Boolean value


 If m is “false”, aka 0, aka NULL, it is not pointing to anything
 Otherwise, it is (presumably) pointing to something good
 Note: It is up to the programmer to assign NULL values when
necessary

5 CS 3090: Safety Critical Programming in C


Indirection operator *
 Moves from address to contents

char *m = ″dog″;
d o g NUL
(char) (char) (char) (char)
char result = *m;

d
(char *) (char)

m gives an address of a char m result


*m instructs us to take the contents of that address
result gets the value ′d′

6 CS 3090: Safety Critical Programming in C


Address operator &
 Instead of contents, returns the address

char *m = ″dog″,
**pm = &m; d o g NUL
(char) (char) (char) (char)

(char *)

pm needs a value of type char ** m


 Can we give it *m? No – type is char
(char **)
 Can we give it m? No – type is char *
pm
 &m gives it the right value – the address of a char * value

7 CS 3090: Safety Critical Programming in C


Pointer arithmetic
 C allows pointer values to be incremented by integer
values

char *m = ″dog″; d o g NUL


(char) (char) (char) (char)

char result = *(m + 1);

o
(char *) (char)

m gives an address of a char m result


(m + 1) gives the char one byte higher
*(m + 1) instructs us to take the contents of that address
result gets the value ′o′

8 CS 3090: Safety Critical Programming in C


Pointer arithmetic
 A slightly more complex example:

char *m = ″dog″;
d o g NUL
(char) (char) (char) (char)
char result = *++m;

o
m gives an address of a char (char *) (char)

++m changes m, to the address one byte higher, m result


and returns the new address
*++m instructs us to take the contents of that location
result gets the value ′o′

9 CS 3090: Safety Critical Programming in C


Pointer arithmetic
 How about multibyte values?
 Q: Each char value occupies exactly one byte, so obviously incrementing the
pointer by one takes you to a new char value...
But what about types like int that span more than one byte?
 A: C “does the right thing”: increments the pointer by
the size of one int value

17 42
(int) (int)

42
(int *) (char)
(int)
int a[2] = {17, 42};
m result
int m = a;
int result = *++m;

10 CS 3090: Safety Critical Programming in C


Example: initializing an array
#define N_VALUES 5
float values[N_VALUES];
&values
&values[0] [N_VALUES]

0 0 0 0 0
(float []) (float) (float) (float) (float) (float) (done!)
values

(float *)

float *vp; vp
for ( vp = &values[0]; vp < &values[N_VALUES]; )
*vp++ = 0;

11 CS 3090: Safety Critical Programming in C


A note on assignment: Rvalues vs. Lvalues
 What’s really going on in an assignment?
 Different things happen on either side of the =
int a = 17, b = 42; 17 42
(int) (int)

b = a; a b

a is the “rvalue” (right value)


We go to the address given by a...
and get the contents (17)

b is the “lvalue” (left value)


We go to the address given by b...and get the contents?
No! We don’t care about 42!
We just want the address of b – to store 17 into

12 CS 3090: Safety Critical Programming in C


A note on assignment: Rvalues vs. Lvalues
 This explains a certain “asymmetry” in assignments
involving pointers: d o g NUL
(char) (char) (char) (char)

char *m = NULL, **pm = NULL; (char *)

m
m = “dog”;
Here, m is an lvalue – It’s understood that (char **)
the address of m is what’s needed pm
pm = &m;
Once again, we need the address of m –
but since it’s an rvalue, just plain m will give the contents of m –
use & to get the address instead
13 CS 3090: Safety Critical Programming in C
Example: strcpy “string copy”
char *strcpy(char *dest, const char *src)

 (assume that) src points to a sequence of char values that


we wish to copy, terminated by NUL
 (assume that) dest points to an accessible portion of
memory large enough to hold the copied chars
 strcpy copies the char values of src to the memory
pointed to by dest
 strcpy also gives dest as a return value

14 CS 3090: Safety Critical Programming in C


Example: strcpy “string copy”
char *strcpy(char *dest, const char *src) {
const char *p;
char *q;
for(p = src, q = dest; *p != '\0'; p++, q++)
*q = *p;
*q = '\0'; d o g NUL
(char *) (char) (char) (char) (char)
return dest; src
}
p (char *) (char *) q

d o g NUL
(char *) (char) (char) (char) (char)
dest
15 CS 3090: Safety Critical Programming in C
Pointer subtraction and relational
operations
 Only meaningful in special context: where you have two
pointers referencing different elements of the same array
 q – p gives the difference (in number of array elements, not
number of bytes between p and q (in this example, 2)
 p < q returns 1 if p has a lower address than q; else 0
(in this example, it returns 1)

(float *) (float *)

p q

(float) (float) (float) (float) (float)

16 CS 3090: Safety Critical Programming in C

You might also like