Vous êtes sur la page 1sur 17

8831 llaF ytisrevinU zarihS gnireenignE retupmoC dna lacirtcelE fo tnemtrapeD

Principles of Programming in C

Basic Usage of Pointers ( )

Reza Azimi

Variable Declaration
int number;

number 0x18879A5B

Name

Memory Space What happens to the name number after the program is compiled? The compiler translates: number address
>=

street names => postal codes


:fo noitalsnart ecivres tsop eht ekiL

yromem ni

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

3
61

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

smetsyS tib-46 rof )1- 462( FFFF FFFF FFFF FFFF )1- 232(
A multi-byte unit of memory address is called word, which is usually 4 bytes.
01552
=

61FF

ot 0 morf segnar

eulav etyb hcae ,eroferehT

61

0000 0000 0000 0000

Memory Addressing (repeated)

Memory address space of each running program is independent of the others.

ecapS sserddA yromeM raeniL

Basic unit of memory addressing is one byte (8 bits).

.0

ta trats sesserdda yromem

,smargorp lla rof snaem tahT

Remembering Memory Address


int number;

number 0x18879A5B
ot stniop

p
18

87

9A

5B

int *p; p = &number;


address of
4

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Pointer (Address) Variables


int *p; int i = 100; int j = 50; i
ypoc

p = &i; j = *p; j
content of (pointer dereferencing)

i=?, j=?

*p = 50;
5

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Typed Pointers
int *p; double *q; char *r; int i; p q i r = = = = &i; &i; *p; *p; /* points only to integers */ /* points only to doubles */ /* points only to characters */

/* /* /* /*

CORRECT */ WRONG */ CORRECT */ WRONG */

But this is C, well see how to do typecasting on pointers too!


6

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Initializing a Pointer Variable


int *p; *p = 50;
Crash or Undefined Behavior

p has a random value,


so it points to a random location in memory!

int *p, i; p = &i; *p = 50;

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

More Pointer Examples


int k, j, *p, *q; k = 100; j = 50; p = &j; q = p; k = *q; *p = k;
imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

k=?, j=?
8

A Common Mistake
int k, j, *p, *q; k = 100; j = 50; q = k; *q = 10;

Compiler may give you only a warning! Software may crash as a result.

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Passing Pointers as Argument


int f(int *k) { int t; t = *k; printf(%d \n, t); } int main(void) { int x = 10; f(&x); ...
01

Whats the output of this program?

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Passing Pointers as Argument


int f(int *k) { int t; t = *k; printf(%d \n, t); *k = 100; } int main(void) { int x = 10; x f(&x); printf(%d\n, x); ...
Call Stack

t
sserdda .ter

&x (k) . . .

11

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Pass by Reference

void max_min(int a[], int n, int *max, int *min) { max_min from p 250 int j; Call Stack *max = a[0]; *min = a[0]; for (j = 1; j < n; j++) { if (a[j] > *max) *max = a[j]; max else if (a[j] < *min) min *min = a[j]; } } int main(void) { int b[N], big, small; big max_min(b, N, &big, &small);

small
21

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

]koob sgniK eht morf nekat elpmaxe[

Remember Pass by Value?


double weird_avg(double x, double y) { x = x + y; Whats the output of this program? return x / 2; }

Where are x and y located?

int main() { double number1 = 10.5, number2 = 7.5, avg; printf(Enter the two numbers: \n); scanf(%lf %lf, &number1, &number2); avg = weird_avg(number1, number2); printf(%g %g %g \n, number1, number2, avg); ...
31

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Pointers as Arguments
double weird_avg(double *x, double *y) { *x = *x + *y; return *x / 2; }

Side Effect

int main() { double number1 = 10.5, number2 = 7.5, avg;

avg = weird_avg(&number1, &number2); printf(%g %g %g \n, number1, number2, avg); ...

Whats the output of this program?


41

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Now we know why


int main() { double number1 = 10.5, number2 = 7.5, avg; printf(Enter the two numbers: \n);

scanf(%lf %lf, &number1, &number2);


...

51

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Pointers as Return Values


int *max(int *a, int *b) { if (*a > *b) { return a; } else { return b; } } int *p, i, j; p = max(&i, &j); printf(%d\n, *p);
61

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

]koob sgniK eht morf nekat elpmaxe[

Returning Pointers
int *max(int *a, int *b) { int k; Whats wrong with if (*a > *b) this program? k = *a; else Never return a k = *b; pointer to a local return &k; variable! } int *p, i, j; p = max(&i, &j);

printf(%d\n, *p);
71

imizA azeR yb ,8831 llaF ,ytisrevinU zarihS ,selpicnirP gnimmargorP

Vous aimerez peut-être aussi