32
[CSE10200] Programming Basis (프로그래밍 기초) Chapter 9 Seungkyu Lee Assistant Professor, Dept. of Computer Engineering Kyung Hee University

Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

[CSE10200] Programming Basis

(프로그래밍 기초)

Chapter 9

Seungkyu Lee

Assistant Professor, Dept. of Computer Engineering

Kyung Hee University

Page 2: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

CHAPTER 9 Pointers #1 Review

Page 3: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointer

int main ()

{

int a;

int b;

int c;

int* ptr;

a = 1000;

b = 2000;

c = 3000;

ptr = &a;

}

1000 2000 3000

1004 1008 1012 1016

int a int b int c

1004

3004 3008

int* ptr memory address of ‘a’

Page 4: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointer

“포인터는 메모리 주소 값을 갖는 변수”

‘Pointer’ is

a variable

that contains a memory address of other variable

(does not contain an actual data).

This is why we call it “Pointer”

since it is used to POINT other variable.

Page 5: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointer and data

5

1004 1008

a

1004

ptr

int a=5;

int* ptr;

ptr = &a;

1028 1032

cout << *ptr;

cout << &ptr;

값의 주소는?

주소의 값은?

cout << *a; (error)

Page 6: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pass by value

Page 7: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pass by reference

Page 8: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pass by address(pointers)

Page 9: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointers to pointers

Page 10: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointer compatibility

Page 11: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

CHAPTER 9 Pointers #2

Page 12: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointers to arrays

a &a[0] same

‘a’ is a pointer only to the first element, not the whole array

Page 13: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Array name as a pointer

int main ()

{

int a[3];

cout << &a[0];

// → 1004

cout << a;

// → 1004

}

1000 2000 3000

a[0] a[1] a[2]

1004 1008 1012 1016

a The name of an array is a pointer constant to its

first element

13

Page 14: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Dereference of array name

Page 15: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Array names as pointers

Page 16: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Multiple array pointers

Page 17: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointer Arithmetic and Arrays

Given pointer, p, p ± n is a pointer to the

value n elements away.

-

Page 18: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointer arithmetic and different types

Page 19: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Dereferencing array pointers

Page 20: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Find smallest

Page 21: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointers and other operators

int a[20];

int * p = &(a[5]);

for(int i=0;i<20;i++)

a[i] = i;

cout << p+5 << endl; //address of a[10]

cout << *(p+5) << endl; //10

cout << *(p++) << endl; //5

cout << *(p) << endl; //6

cout << *(--p) << endl; //5

int * q = &(a[9]);

cout << *(p + (q-p)/2) << endl; //7

return 0;

Page 22: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointers to two-dimensional arrays

Page 23: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Pointers to two-dimensional arrays

• table[0] is identical to *(table + 0)

• table[0][0] is identical to *(*(table)

• table[i][j] is identical to *(*(table + i) + j)

Page 24: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Two dimension array and pointer

1

0013FF10

2

0013FF14

3

0013FF18

4

0013FF1C

5

0013FF20

6

0013FF24

7

0013FF28

8

0013FF2C

9

0013FF30

10

0013FF34

11

0013FF38

12

0013FF3C

int Dim2[3][4]

Page 25: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Two dimension array and pointer

1

0013FF10

2

0013FF14

3

0013FF18

4

0013FF1C

5

0013FF20

6

0013FF24

7

0013FF28

8

0013FF2C

9

0013FF30

10

0013FF34

11

0013FF38

12

0013FF3C

int Dim2[3][4]

Dim2[0]

Dim2[1]

Dim2[2]

Dim2[0][0] Dim2[0][1] Dim2[0][2] Dim2[0][3]

Dim2[1][0] Dim2[1][1] Dim2[1][2] Dim2[1][3]

Dim2[2][0] Dim2[2][1] Dim2[2][2] Dim2[2][3]

=Dim2

Page 26: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Two dimension array and pointer

1

0013FF10

2

0013FF14

3

0013FF18

4

0013FF1C

5

0013FF20

6

0013FF24

7

0013FF28

8

0013FF2C

9

0013FF30

10

0013FF34

11

0013FF38

12

0013FF3C

int Dim2[3][4]

Dim2[0] =*(Dim2+0) =Dim2+0 ?

Dim2[1] =*(Dim2+1) =Dim2+1 ?

Dim2[2] =*(Dim2+2) =Dim2+2 ?

Dim2 It’s a “Pointer

to Pointer”

Points to start of array

Dim2[0]+1 = *Dim2 +1

Page 27: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Two dimension array and pointer

1 2

0013FF14

3

0013FF18

4

0013FF1C

5

0013FF20

6

0013FF24

7

0013FF28

8

0013FF2C

9

0013FF30

10

0013FF34

11

0013FF38

12

0013FF3C

int Dim2[3][4]

Dim2[1]+1 *(Dim2+1)+1

0013FF10

*(Dim2[1]+1) *(*(Dim2+1)+1)

Page 28: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Simple codes

Page 29: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Results

Page 30: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Passing one dimensional array to a function

void doIt(int ary[]);

void doThat(int *ary);

int main()

{

int a[10];

int *p = &(a[0]);

doIt(a);

doThat(a);

doIt(p);

doThat(p);

doIt(&(a[0]));

doThat(&(a[0]));

}

Page 31: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Passing 2 dimensional array to a function

void doIt(int ary[][20]);

void doThat(int **ary); //wrong

int main()

{

int a[10][20];

int (*p)[20] = a;

doIt(a);

doThat(a); //wrong

doIt(p);

doThat(p); //wrong

doIt(&(a[0]));

doThat(&(a[0])); //wrong

}

Page 32: Seungkyu Lee - khu.ac.krcvlab.khu.ac.kr/Lecture12.pdf · 2014-05-27 · 12 0013FF3C int Dim2[3][4] Two dimension array and pointer 1 0013FF10 2 0013FF14 3 0013FF18 4 0013FF1C 5 0013FF20

Passing 3 dimensional array to a function

void doIt(int ary[][10][20]);

int main()

{

int a[5][10][20];

int (*p)[10][20] = a;

doIt(a);

doIt(p);

doIt(&(a[0]));

}