(1A)
Coyright (c) 2010-2018 Young W. Lim. Permission is granted to coy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version ublished by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A coy of the license is included in the section entitled "GNU Free Documentation License". Please send corrections (or suggestions) to youngwlim@hotmail.com. This document was roduced by using LibreOffice.
Variables and their addresses address data int a; &a a int * ; & int **q; &q q 3
Initialization of Variables address data int a = 100; &a a = 100 int * = &a; & = &a int **q = &; &q q = & 4
Traditional arrow notations address data address data &a a = 100 &a a = 100 & = &a & = &a &q q = & &q q = & 5
Pointed addresses :, q address data int a; a int * = &a; q int **q = &; &q q = &a q = & 6
Dereferenced Variables : * address data int a; * * a int * = &a; & int **q = &; 7
Dereferenced Variables : * int a; int * = &a; int **q = &; Address assignment = &a &a *() *(&a) * a Variable aliasing * a Relations after address assignment 8
Dereferenced Variables : *q, **q address data int a; *q **q **q a int * = &a; q *q *q int **q = &; &q q 9
Dereferenced Variables : *q, **q int a; int * = &a; Address assignment = &a Variable aliasing * a int **q = &; q = & *q **q a q & *(q) *(&) * q **q * **q a Relations after address assignment 10
Two more ways to access a : *, **q &a a * *q **q & & q *q &q q &q q &q q a * a **q a 11
Two more ways to access a : *, **q address data &a & a * **q &q q 1) Read / Write a 2) Read / Write * 3) Read / Write **q 12
Variables int a; a can hold an integer address &a data a a = 100; a holds 100 address &a data a 100 13
Pointer Variables int * ; can hold an address int * ; holds an address of a int tye data & ointer to int int * ; * holds a int tye data int * 14
Pointer to Pointer Variable int ** q; q holds an address int ** q; q holds an address of a ointer to int tye data ointer to ointer to int &q q int * *q; ointer to int *q holds an address of a int tye data q *q int **q; **q holds a int tye data *q **q int 15
Pointer Variables Examles int a = 200; &a address 0x3A0 a data 200 int * = & a; & 0x3AB 0x3A0 int ** q = & ; &q 0x3CE q = 0x3AB &q 0x3CE q 0x3AB *q 0x3A0 **q 200 16
Pointer Variable with an arrow notation address data * &a address 0x3A0 a data 200 & & 0x3AB 0x3A0 using an arrow notation & * 0x3AB 0x3A0 200 17
Pointer Variable q with an arrow notation address data address data *q **q &a 0x3A0 a 200 q *q & 0x3AB 0x3A0 &q q &q 0x3CE q = 0x3AB using an arrow notation &q q 0x3CE 0x3AB *q 0x3A0 **q 200 18
The tye view oint of ointers data address (int *) address (int **) Tyes 19
The different view oints of ointers **q *q (int *) *q q (int **) q &q Tyes Variables Addresses 20
Single and Double Pointer Examles (1) int a ; int * ; int **q ; a * a, *, and **q: int variables q q *q *q **q 21
Single and Double Pointer Examles (2) int a ; int * ; int * *q ; a * and *q : int ointer variables (singleointers) q q *q *q **q 22
Single and Double Pointer Examles (3) int a ; int * ; int ** q ; a * q : double int ointer variables q q *q *q **q 23
Values of double ointer variables int **, **q ; (int **) (int **) X X = q; (int *) (float *) (float) 24
Pointed Addresses and Data int a ; &a a =100 The variable a holds an integer data int * ; & 200 The ointer variable holds an address, at this address, an integer data is stored int * * q ; &q q *q 30 The ointer variable q holds an address, at the address q, another address *q is stored, at the address *q, an integer data **q is stored 25
Dereferencing Oerations * int a &a a =100 *(&a) = a * * int * & *=200 *(&) = *() = * * * * int * * q &q q q *q *q **q=30 *(&q) = q *(q) = *q *(*q) = **q 26
Direct Access to an integer a int a ; &a a =100 Direct Access address &a value a integer 1 memory access 27
Indirect Access * to an integer a int * ; & *=200 Indirect Access address & value 2 memory accesses Dereference Oerator * the content of the ointed location * 28
Double Indirect Access **q to an integer a int * * q ; &q q q *q *q **q=30 Double Indirect Access address &q value q 3 memory accesses Dereference Oerator * the content of the ointed location q *q Dereference Oerator * the content of the ointed location *q **q 29
Values of Variables int a ; &a a =100 address &a value a integer int * ; & *=200 address value & * address integer int * * q ; &q q q *q *q **q=30 address value &q q q *q *q **q address address integer 30
Swaing ointers - ass by reference - double ointers 31
Swaing integer ointers & = &a & = &b &q q = &b &q q = &a a = 111 a = 111 b = 222 b = 222 32
Swaing integer ointers & = &a & = &b &q q = &b &q q = &a int *, *q; swa_ointers( &, &q ); swa_ointers( int **, int ** ); function call function rototye 33
Pass by integer ointer reference void swa_ointers (int **m, int **n) { int* tm; int ** m int * *m int ** n int * *n } tm = *m; *m = *n; *n = tm; int * tm int a, b; int *, *q; =&a, q=&b; swa_ointers( &, &q ); 34
Array of Pointers 35
Array of Pointers int a [4]; int * b [4]; int a [4] No. of elements = 4 Tye of each element int * No. of elements = 4 b [4] Tye of each element 36
Array of Pointers variable view int a [4]; int * b [4]; a b b[0] *b[0] = 11 a[0] = 11 b[0] a[1] = 22 b[1] b[1] *b[1] = 22 a[2] = 33 b[2] a[3] = 44 b[3] b[2] *b[2] = 33 b[3] *b[3] = 44 37
Array of Pointers tye view int a [4]; int * b [4]; (int *) (int * *) (int *) (int *) (int *) (int *) 38
Pointer to Arrays 39
Pointer to an array variable declarations int m ; int *n ; an integer ointer int a [4] int func (int a, int b) ; int (*) [4] an integer array ointer int (* f) (int a, int b) ; a function ointer 40
Pointer to an array a tye view int int * an integer ointer int [] int (*) [4] an integer array ointer int (int, int) int (*) (int, int) a function ointer 41
Pointer to an Array : Assignment and Dereference int a [4] a &a &a int (*) [4] (*) &(*) dereference assignment sizeof()= 8 bytes sizeof(*)= 16 bytes 42
Pointer to an array a variable view int (*) [4]; an array ointer oints to an array a aggregated tye data = &a &a a a a+1 a+2 a+3 a[0] a[1] a[2] a[3] int a [4]; 43
Pointer to an array a aggregated tye view int (*) [4]; An aggregated tye - starting address (&a) - size of all the array elements (16 bytes) a a[0] a[1] a[2] a[3] 4 * sizeof 44
Pointer to an array incrementing a ointer int (*) [4]; addr(+1) - addr() = (long) (+1) - (long) () = 4 * sizeof a a[0] a[1] a[2] 4*sizeof a[3] +1 4*sizeof 45
Pointer to an array dereferencing int a [4]; int (*) [4] = &a; = &a assignment &a a * * a dereference a[0] a[1] a[2] a[3] (*)[0] (*)[1] (*)[2] (*)[3] 46
Pointer to an array a tye view int a [4]; int (*) [4] = &a; (int (*)[4]) (int (*)[4]) (int *) (int *) [4]) (int []) 47
Double ointer to an array a tye view (int (*)[4]) (**)[4]) a ointer to a ointer to an array (int (*)[4]) a ointer to an array (int *) [4]) (int []) (int *) a ointer to an int 48
Series of ointers to an array a tye view a ointer to an int (int *) a ointer to an array (int (*)[4]) (int *) [4]) (int (*)[4]) (int *) [4]) (int (*)[4]) (int *) [4]) an int array name an int array name an int array name 49
Pointer to the series of arrays tye int [4] int [ ] int * (int (*)[4]) (int *) [4]) 4 in [4] is meaningful only in the array declaration the number of array elements (int *) [4]) (int *) [4]) 50
Array ointers and 2-d arrays the array name c of a 2-d array as an array ointer which oints to its 1 st 1-d sub-array with 4 elements. c+1 oints to the 2 nd 1-d sub-array c+2 oints to the 3 rd 1-d sub-array An array of array ointers an aggregated data structure that has the starting address and its size. 2-d array : sizeof(c) = 64 bytes 1-d sub-arrays : sizeof(*c) = 16 bytes a 2-d array with 4 rows and 4 columns (int (*) [4]) c (int []) (int []) (int []) (int []) c[0] c[1] c[2] c[3] c[0][0] c[0][1] c[0][2] c[0][3] c[1][0] c[1][1] c[1][2] c[1][3] c[2][0] c[2][1] c[2][2] c[2][3] c[3][0] c[3][1] c[3][2] c[3][3] 51
Pointer to a 1-d array & (int (*) [4]) = &c[0]; An array ointer: sizeof() = 8 bytes 1-d sub-arrays : sizeof(*) = 16 bytes (int (*) [4]) c +1 +2 +3 (int []) (int []) (int []) (int []) c[0] c[1] c[2] c[3] c[0][0] c[0][1] c[0][2] c[0][3] c[1][0] c[1][1] c[1][2] c[1][3] c[2][0] c[2][1] c[2][2] c[2][3] c[3][0] c[3][1] c[3][2] c[3][3] 52
Pointer to a 2-d array &q (int(*)[4][4]) q = &c; q An array ointer: sizeof(q) = 8 bytes 1-d sub-arrays : sizeof(*q) = 64 bytes q+1 (int (*) [4]) c +1 +2 +3 (int []) (int []) (int []) (int []) c[0] c[1] c[2] c[3] c[0][0] c[0][1] c[0][2] c[0][3] c[1][0] c[1][1] c[1][2] c[1][3] c[2][0] c[2][1] c[2][2] c[2][3] c[3][0] c[3][1] c[3][2] c[3][3] 53
Usinga a ointer to a 1-d array & int (*) [4] ; int c[4] [4] (int (*) [4]) = &c[0]; a 2-d array with 4 rows and 4 columns (int (*) [4]) c [0] [1] [2] [3] [0] [1] [2] [3] [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] [3][0] [3][1] [3][2] [3][3] 54
Using a ointer to a 2-d array & int (*q) [4][4] ; int c [4][4] ; (int(*)[4][4]) q q = &c; a 2-d array with 4 rows and 4 columns (int (*) [4]) c (*q)[0] (*q)[1] (*q)[2] (*q)[3] (*)[0] (*)[1] (*)[2] (*)[3] (*q)[0][0] (*q)[0][1] (*q)[0][2] (*q)[0][3] (*q)[1][0] (*q)[1][1] (*q)[1][2] (*q)[1][3] (*q)[2][0] (*q)[2][1] (*q)[2][2] (*q)[2][3] (*q)[3][0] (*q)[3][1] (*q)[3][2] (*q)[3][3] 55
Pointer to array (4) int c [4][4]; int (*) [4]; = c; func(,... ); void func(int (*x)[4],... ) { } x[r][c] = void func(int x[ ][4],... ) { } x[r][c] = 56
References [1] Essential C, Nick Parlante [2] Efficient C Programming, Mark A. Weiss [3] C A Reference Manual, Samuel P. Harbison & Guy L. Steele Jr. [4] C Language Exress, I. K. Chun