Programming with Pointers - PowerPoint PPT Presentation

About This Presentation
Title:

Programming with Pointers

Description:

Programming with Pointers – PowerPoint PPT presentation

Number of Views:119
Avg rating:3.0/5.0
Slides: 44
Provided by: csU66
Learn more at: http://www.cs.utsa.edu
Category:

less

Transcript and Presenter's Notes

Title: Programming with Pointers


1
Programming with Pointers
CS 2073 Computer Programming w/Eng. Applications
Ch 6

Turgay Korkmaz Office SB 4.01.13 Phone (210)
458-7346 Fax (210) 458-4437 e-mail
korkmaz_at_cs.utsa.edu web www.cs.utsa.edu/korkmaz
2
Name Addr Content



Lecture 28



Lecture
3
6.1 Addresses and Pointers Recall memory concepts
from Ch2
address
name
Memory - content


1 00000001
7 00000111
? arbitrary 1s and 0s
????
8
10 11 12 13 14 15 16
int x11, x27 double distance int p int
q8 p q
x1
x2
distance
16
p
q
4
What is a Pointer?
  • A pointer is a variable that holds the address of
    a memory location
  • If a variable p holds the address of another
    variable q, then p is said to point to q
  • If q is a variable at location 16 in memory, then
    p would have the value 16 (qs address)

5
How to declare a pointer variable
  • Pointer variables are declared using an asterisk
    before the pointer name
  • int a, b, ptr
  • ptr is a pointer to a memory location that can
    store an integer

6
Address Operator
  • A variable can be referenced using the address
    operator
  • For the previous example
  • x1 is the address of x1
  • printf(d, x1) ? will print 12 (address)
  • printf(d, x1) ? will print 1 (content)

7
has different meanings in different contexts
  • a x y ? multiplication
  • int ptr ? declare a pointer
  • is also used as indirection or de-referencing
    operator in C statements.
  • ptr y
  • a x ptr

8
Example Pointers, address, indirection
memory
address
name

?
?
?
?
10
11
12
13
14
  • int a, b
  • int c, d
  • a 5
  • c a
  • d b
  • d 9
  • print c, c, c
  • print a, b

a
5
9
b
c
11
d
12
c11 c5 c13 a5 b9
9
Exercise Trace the following code
memory
address
name
510
511
512
513
514


?
?
?
?
  • int x, y
  • int p1, p2
  • x 3 4
  • Y x / 2 5
  • p1 y
  • p2 x
  • p1 x p2
  • p2 p1 y
  • print p1, p1, p1
  • print x, x, y, y

x
y
p1
p2

10
(No Transcript)
11
Declaration, Assignment, Comparison, Type,
ARITHMETIC
  • More about Pointers

12
Declaring pointers
  • When using the form int p, q
  • the operator does not distribute.
  • In the above example
  • p is declared to be a pointer to int.
  • q is declared to be an int.
  • If you want both to be pointer, then use the form
    int p, q

13
Assigning values to a pointer
  • int a
  • int iPtr
  • Variables are not initialized in the above
    example
  • the assignment operator () is defined for
    pointers
  • As always, the right hand side can be any
    expression as long as it evaluates to the same
    type as the left
  • the operator in front of an ordinary variable
    produces the address of that variable.
  • a 4 5
  • iPtr a

14
Exercise
Give a memory snapshot after each set of
assignment statements int a1, b2, ptr ptr
b a ptr ptr 5




a 102 b 104 ptr 106
15
NULL pointer
  • A pointer can be assigned or compared to the
    integer zero, or, equivalently, to the symbolic
    constant NULL, which is defined in ltstdio.hgt.
  • A pointer variable whose value is NULL is not
    pointing to anything that can be accessed

16
Pointer Initialization
iPtr s dPtr
int iPtr0char s0double dPtrNULL
!!! When we assign a value to a pointer during it
is declaration, we mean to put that value into
pointer variable (no indirection)!!! int
iPtr0 is same as int iPtr iPtr0 / not
like iPtr 0 /
17
Many-to-One Pointing
  • A pointer can point to only one location at a
    time, but several pointers can point to the same
    location.
  • / Declare and
  • initialize variables. /
  • int x-5, y 8
  • int ptr1, ptr2
  • / Assign both pointers
  • to point to x. /
  • ptr1 x
  • ptr2 ptr1
  • The memory snapshot after
  • these statements are executed

x 444 -5
y 446 8
Ptr1 448 444
ptr2 450 444
18
Exercise
Show the memory snapshot after the following
operations
  • int x2, y5, temp
  • int ptr1, ptr2, ptr3
  • // make ptr1 point to x
  • ptr1 x
  • // make ptr2 point to y
  • ptr2 y

2
5
?
x
y
temp
ptr1
ptr2
ptr3
19
Exercise
Show the memory snapshot after the following
operations
  • // swap the contents of
  • // ptr1 and ptr2
  • ptr3 ptr1
  • ptr1 ptr2
  • ptr2 ptr3

2
5
?
x
y
temp
ptr1
ptr2
ptr3
20
Exercise
Show the memory snapshot after the following
operations
  • // swap the values pointed
  • // by ptr1 and ptr2
  • temp ptr1
  • ptr1 ptr2
  • ptr2 temp

5
2
5
x
y
temp
ptr1
ptr2
ptr3
21
Comparing Pointers
  • You may compare pointers using gt,lt, etc.
  • Common comparisons are
  • check for null pointer if (p NULL)
  • check if two pointers are pointing to the same
    location
  • if (p q) Is this equivalent to
  • if (p q)
  • Then what is if (p q)
  • compare two values pointed by p and q

22
Pointer types
  • Declaring a pointer creates a variable that is
    capable of holding an address
  • And addresses are integers!
  • But, the type we specify in the declaration of a
    pointer is the type of variable to which this
    pointer points
  • !!! a pointer defined to point to an integer
    variable cannot also point to a float/double
    variable even though both holds integer address
    values !!!

23
Example pointers with different types
5
23.453
102
106

a 102 b 106 iPtr 114 dPtr 118 122
  • int a5
  • double b23.452
  • int iPtr
  • double dPtr
  • iPtr a
  • dPtr b
  • the variable iPtr is declared to point to an int
  • the variable dPtr is declared to point to a
    double

24
Name Addr Content



Lecture 29



Lecture
25
6.4 Pointers in Function References (!IMPORTANT!)
  • In C, function references are call-by-value
    except when an array name is used as an argument.
  • An array name is the address of the first element
  • Values in an array can be modified by statements
    within a function
  • To modify a function argument, a pointer to the
    argument must be passed
  • scanf(f, X) This statement specifies that
    the value read is to be stored at the address of
    X
  • The actual parameter that corresponds to a
    pointer argument must be an address or pointer.

26
Call by Value
  • void swap(int a,int b)
  • int temp
  • temp a
  • a b
  • b temp
  • return
  • main()
  • int x 2, y 3
  • printf("d d\n,x,y)
  • swap(x,y)
  • printf("d d\n,x,y)

Changes made in function swap are lost when the
function execution is over
27
Call by reference
  • void swap2(int aptr,
  • int bptr)
  • int temp
  • temp aptr
  • aptr bptr
  • bptr temp
  • return
  • main()
  • int x 2, y 3
  • printf("d d\n,x,y)
  • swap2(x, y)
  • printf("d d\n,x,y)

Changes made in function swap are done on
original x and y and. So they do not get lost
when the function execution is over
28
Trace a program
main() int x05, x12, x23 int p1x1,
p2 p2 x2 swap2(x0, x1)
swap2(p1, p2) printf(d d d\n, x0, x1,
x2) void swap2(int a, int b) int tmp
tmp a a b b tmp
return
Name Addr Value
x0 1
x1 2
x2 3
p1 4
p2 5
6
a 7
b 8
tmp 9
29
Now we can get more than one value from a
function
  • Write a function to compute the roots of
    quadratic equation ax2bxc0. How to return two
    roots?
  • void comproots(int a,int b,int c,
  • double dptr1, double dptr2)
  • dptr1 (-b - sqrt(bb-4ac))/(2.0a)
  • dptr2 (-b sqrt(bb-4ac))/(2.0a)
  • return

30
Exercise contd
  • main()
  • int a,b,c
  • double root1,root2
  • printf("Enter Coefficients\n")
  • scanf("d d d",a,b,c)
  • computeroots(a,b,c,root1,root2)
  • printf("First Root lf\n",root1)
  • printf("Second Root lf\n",root2)

31
Trace a program
main() int x, y max_min(4, 3, 5, x, y)
printf( First d d, x, y) max_min(x, y,
2, x, y) printf(Second d d, x,
y) void max_min(int a, int b, int c,
int max, int min) max a min
a if (b gt max) max b if (c gt max)
max c if (b lt min) min b if (c lt
min) min c printf(F d d\n, max,
max)
name Addr Value
x 1
y 2
3
4
5
a 6
b 7
c 8
max 9
min 10
32
  • SKIP REST
  • IF TIME PERMITS
  • WE MAY COVER THEM AT THE END OF THE SEMESTER

33
Pointer Arithmetic
  • Four arithmetic operations are supported
  • , -, , --
  • only integers may be used in these operations
  • Arithmetic is performed relative to the variable
    type being pointed to
  • MOSTLY USED WITH ARRAYS (see next section)
  • Example p
  • if p is defined as int p, p will be incremented
    by 4 (system dependent)
  • if p is defined as double p, p will be
    incremented by 8(system dependent
  • when applied to pointers, means increment
    pointer to point to next value in memory

34
6.2 Pointers and Arrays
  • The name of an array is the address of the first
    elements (i.e. a pointer to the first element)
  • The array name is a constant that always points
    to the first element of the array and its value
    can not be changed.
  • Array names and pointers may often be used
    interchangeably.
  • Example
  • int num4 1,2,3,4, p, q
  • p num
  • q p // or q num
  • / above assignment is the same as p num0
    /
  • printf(i, p) // print num0
  • p
  • printf(i, p) // print num1
  • printf(i, q) // print num0
  • printf(i, (p2)) // print num2

35
Pointers and Arrays (contd)
  • You can also index a pointer using array notation
  • char string This is a string
  • char str
  • int i
  • str string
  • for(i 0 stri!NULL i)
  • printf(c, stri)

36
Two Dimensional Arrays
A two-dimensional array is stored in sequential
memory locations, in row order.
int s23 2,4,6, 1,5,3 int sptr
s00 Memory
allocation s00 2 s01 4 s02 6
s10 1 s11 5 s12 3 A pointer
reference to s01 would be (sptr1) A pointer
reference to s11 would be (sptr4) row
offset number of columns column offset
37
Exercise
  • Study Section 6.3 from the textbook

38
Skip
  • Study section 6.5 from the textbook
  • We studied section 6.6 Strings under one
    dimensional char arrays in ch 5

39
6.7 Dynamic Memory Allocation
  • Dynamically allocated memory is determined at
    runtime
  • A program may create as many or as few variables
    as required, offering greater flexibility
  • Dynamic allocation is often used to support data
    structures such as stacks, queues, linked lists
    and binary trees.
  • Dynamic memory is finite
  • Dynamically allocated memory may be freed during
    execution

40
Dynamic Memory Allocation
  • Memory is allocated using the
  • malloc function (memory allocation)
  • calloc function (cleared memory allocation)
  • Memory is released using the
  • free function
  • The size of memory requested by malloc or calloc
    can be changed using the
  • realloc function

41
malloc and calloc
  • Both functions return a pointer to the newly
    allocated memory
  • If memory can not be allocated, the value
    returned will be a NULL value
  • The pointer returned by these functions is
    declared to be a void pointer
  • A cast operator should be used with the returned
    pointer value to coerce it to the proper pointer
    type

42
Example of malloc and calloc
int n 6, m 4 double x int p /
Allocate memory for 6 doubles. / x (double
)malloc(nsizeof(double)) / Allocate
memory for 4 integers. / p (int
)calloc(m,sizeof(int))
X
p
43
Skip
  • Study Section 6.8 (optional)
Write a Comment
User Comments (0)
About PowerShow.com