• 검색 결과가 없습니다.

1차원 배열과 포인터

N/A
N/A
Protected

Academic year: 2022

Share "1차원 배열과 포인터 "

Copied!
22
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

선후수 과목 연계 강좌 : C++ 프로그래밍 입문을 위한 C 프로그래밍

[email protected]

황준하

금오공과대학교 컴퓨터공학과

(2)

1차원 배열과 포인터

복잡한 배열과 포인터 타입

이중 포인터

배열에 대한 포인터

포인터 변수의 배열

복잡한 포인터와 배열의 타입 및 크기 알아내기

2차원 배열과 포인터 연습 문제

17강. 배열과 포인터

(3)

int 배열 ary의 원소를 가리키는 포인터

int 포인터 변수 : int *ptr = &ary[0];

ptr++는? 다음 원소를 가리킴!

ptr--는? 이전 원소를 가리킴!

17강. 배열과 포인터 1차원 배열과 포인터

(4)

int ary[5] = { 1, 2, 3, 4, 5 }; 배열의 모든 원소의 값 을 합산한 결과를 출력하되, 포인터를 통해 각 원소에 접 근해 보라.

17강. 배열과 포인터 1차원 배열과 포인터

int main()

{ int ary[5] = { 1, 2, 3, 4, 5 };

int *ptr;

int result = 0;

ptr = &ary[0];

for (int i = 0; i < 5; i++) {

result += *ptr;

ptr++;

}

cout << "합계 : " << result << endl;

1 2 3 4 5 6 7 8 10 9 11 12 13 14 15

(5)

4 /21

배열 이름

int ary[5];

배열 이름 ary  첫 번째 원소의 주소

상수이므로 값 변경 불가 : ary = 2000; X

17강. 배열과 포인터 1차원 배열과 포인터

int main()

{ int ary[5] = { 1, 2, 3, 4, 5 };

int *p;

p = ary; // p = &ary[0] 동일

for (int i = 0; i < 5; i++) {

cout << *p << endl;

p++;

}

return 0;

} 1 2 3 4 5 6 7 8 10 9 11 12 13 14 15

ary는 &ary[0]와 같다!

ary의 타입은 int *이다!

(6)

ary[3] = 2;에서 ary[3]의 동작 원리

ary[3]  *(ary + 3)

ary[0]  *(ary + 0)  *ary

ary[i]  *(ary + i)

내부적으로 포인터로 처리됨

포인터도 배열 모양으로 사용 가능

p가 ary 배열의 첫 번째 원소를 가리키는 경우

*p  p[0]  ary[0]

*(p + 1)  p[1]  ary[1]

*(p + i)  p[i]  ary[i]

17강. 배열과 포인터 1차원 배열과 포인터

배열은 포인터처럼,

포인터는 배열처럼 사용 가능!

(7)

17강. 배열과 포인터 1차원 배열과 포인터

int main()

{ int ary[5] = { 1, 2, 3, 4, 5 };

int *ptr;

ptr = ary;

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

*(ary + i) = *(ary + i) * 100;

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

cout << "ptr[" << i << "] : " << ptr[i] << endl;

return 0;

} 1 2 3 4 5 6 7 8 10 9 11 12 13 14

15 *(ptr + i)

ary[i] = ary[i] * 100;

ptr = &ary[0];

(8)

이중 포인터  포인터에 대한 포인터

포인터 변수 또한 변수이다!

int num;의 주소를 저장하는 변수는? int *ptr1 = &num;

int *ptr1;의 주소를 저장하는 변수는? int **ptr2 = &ptr1;

 이중 포인터

확장 가능

int ***ptr; int ****ptr;

17강. 배열과 포인터 복잡한 배열과 포인터 타입

(9)

역참조 연산자의 활용

int **ptr2

*ptr2 : 가리키는 int 포인터

**ptr2 : 가리키는 int 포인터가 가리키는 int 변수

17강. 배열과 포인터 복잡한 배열과 포인터 타입

int main()

{ int num = 5;

int *ptr1 = &num;

int **ptr2 = &ptr1;

**ptr2 = 100;

cout << "num : " << num << endl;

cout << "*ptr1 : " << *ptr1 << endl;

cout << "**ptr2 : " << **ptr2 << endl;

return 0;

} 1 2 3 4 5 6 7 8 10 9 11 12 13 14

100

(10)

어떤 변수에 주소 연산자 적용  그 변수 타입의 포인터

int a; &a  int 포인터  int *

double b; &b  double 포인터  double *

int *p; &p  int 포인터의 포인터  int **

int ary[5]; &ary  int 1차원 배열[5] 포인터  int (*)[5]

int ary[3][4]; &ary  2차원 배열[3][4]의 포인터  int (*)[3][4]

17강. 배열과 포인터 복잡한 배열과 포인터 타입

어떤 변수에 주소 연산자를 붙이면 그 변수 타입의 포인터가 반환됨!

(11)

1차원 배열 자체를 가리키는 포인터의 사용

원소를 가리키는 포인터가 아님!

17강. 배열과 포인터 복잡한 배열과 포인터 타입

int main()

{ int ary1[5] = { 1, 2, 3, 4, 5 };

int(*ptr1)[5] = &ary1;

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

cout << "(*ptr1)[" << i << "]=" << (*ptr1)[i] << " " << endl;

return 0;

} 1 2 3 4 5 6 7 8

10 9 ary1[i]와 동일

(12)

int 변수를 원소로 갖는 배열

int ary1[5];

int * 변수를 원소로 갖는 배열

int *ary2[5];

ary2[0], ary2[1], ..., ary2[4] 각각이 int * 변수 의미

ary2[0][1]의 의미는?

ary2[0] 포인터가 가리키는 곳, 그 다음 int

int (*a)[5]와 int *a[5]의 비교

int (*a)[5] : (int [5]) 배열에 대한 포인터

int *a[5] : int * 변수를 원소로 갖는 배열

17강. 배열과 포인터 복잡한 배열과 포인터 타입

(13)

17강. 배열과 포인터 복잡한 배열과 포인터 타입

int main()

{ int a = 1, b = 2, c = 3;

int *ary[3] = { &a, &b, &c };

for (int i = 0; i < 3; i++) *ary[i] = *ary[i] * 100;

cout << "a : " << a << endl;

cout << "b : " << b << endl;

cout << "c : " << c << endl;

return 0;

} 1 2 3 4 5 6 7 8 10 9 11 12 13 14

*

*

*

1

2

3

a

b

c ary

(14)

예 : int *(*var[3])[3]의 타입은?

변수명을 중심으로 영어로 읽은 후 해석

괄호가 없다면 배열이 포인터보다 우선

var is array[3] of pointer to array[3] of pointer to int

int * 배열[3]에 대한 포인터를 원소로 갖는 배열[3]

17강. 배열과 포인터 복잡한 배열과 포인터 타입

(15)

2차원 배열에서 첫 번째 원소란?

2차원 배열에서 첫 번째 원소란?  첫 번째 1차원 배열

int ary[3][4] 첫 번째 원소  ary[0]  첫 번째 1차원 배열 [4]

17강. 배열과 포인터 2차원 배열과 포인터

(16)

1차원 배열의 이름

첫 번째 원소의 주소!

2차원 배열의 이름

첫 번째 원소의 주소!

int ary[3][4]에서

ary  첫 번째 원소의 주소  &ary[0]

ary[0]은 1차원 배열[4]  &ary[0]은 1차원 배열[4]의 주소

int (*p)[4] = ary;

p++ : 16 증가

p[0][2]와 같이 2차원 배열과 동일하게 사용 가능

17강. 배열과 포인터 2차원 배열과 포인터

배열 이름의 타입 :

가장 가까운 배열만 포인터로 변경하면 됨 int ary1[2][3][4]; ary1  int (*)[3][4]

(17)

배열은 포인터처럼, 포인터는 배열처럼 사용 가능

ary[i][j]에 대해 다음 모두 동일

*(ary[i] + j)

(*(ary + i))[j]

*(*(ary + i) + j)

예 : int ary[3][4]

*(*(ary + 1) + 2)  ary[1][2]

*ary  ary[0]

*(ary + 1) + 2  ary[1] + 2  &ary[1][2]

*(ary + 1)  ary[1]

ary + 1  &ary[1]

17강. 배열과 포인터 2차원 배열과 포인터

(18)

17강. 배열과 포인터 2차원 배열과 포인터

int main()

{ int ary[3][4];

int(*ptr)[4] = ary;

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 4; j++) *(*(ary + i) + j) = i + j;

// 배열은 포인터처럼 사용 가능 }

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 4; j++) cout << ptr[i][j] << "\t";

// 포인터는 배열처럼 사용 가능 cout << endl;

} 1 2

3 4 5 6 7 8 10 9 11 12 13 14 15 16 17 18 19 20

(19)

int ary[3][4] 가 있다. ary[2][3] = 5;와 동일한 의미 가 되도록 ary를 포인터 방식으로 사용해 보라.

다음 각 변수가 무엇을 뜻하는지 말해 보라.

int **a[3];

int (*b)[3][4];

int *(*c)[3];

17강. 배열과 포인터 연습 문제

*(*(ary + 2) + 3) = 5;

*(ary[2] + 3) = 5;

(*(ary + 2))[3] = 5;

int 포인터의 포인터를 원소로 갖는 1차원 배열[3]

int 포인터를 원소로 갖는 1차원 배열[3]에 대한 포인터 2차원 배열[3][4]에 대한 포인터

ary[i][j] = *(*(ary + i) + j)

(20)

다음과 같은 2차원 배열 ary가 있다. 이 배열의 첫 번째 원소의 주소를 저장할 수 있는 포인터 변수 ptr을 선언하 고 첫 번째 원소(1차원 배열)를 가리키게 한 후 ptr을 통 해 모든 원소의 값을 합산한 결과를 출력하도록 하라. 단, 포인터 변수 ptr를 2차원 배열처럼 사용해 보도록 하라.

17강. 배열과 포인터 연습 문제

int ary[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };

(21)

17강. 배열과 포인터 연습 문제

int main()

{ int ary[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };

int (*ptr)[4] = ary;

int sum = 0;

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 4; j++) sum += ptr[i][j];

}

cout << "합계 : " << sum << endl;

return 0;

} 1 2 3 4 5 6 7 8 10 9 11 12 13 14 15 16

(22)

17강의 학습 내용

1차원 배열과 포인터

복잡한 배열과 포인터 타입

이중 포인터

배열에 대한 포인터, ...

2차원 배열과 포인터

18강의 학습 내용

함수와 포인터

함수와 배열

17강. 배열과 포인터 학습 내용 정리

참조

관련 문서

CHAP 3:배열,

최종으로

™ 선언된 이름의 바인딩 정보를

어떤 별에서 스펙트럼 선이 관측되지 않았다고 해서 그 원소가 그 천체에 존재하지 않는다고 할 수 없다 별 대기에서의 온도와 압력이.

 컴퓨터공학과의 김이화 학생과 환경공학과의 홍이화 학생의 정보를 저장 하고자 한다... (예제2) 학과 주소를

다른 자산에 비해 어떤 자산의 기대수익률이 상대적으로 높아지 면, 그 자산에 대한 수요량이 증가. 다른 자산에 비해 어떤 자산의 유동성이 상대적으로

 자기 참조 구조체(self-referential structure)는 특별한 구조체로서 구성 멤버 중에 같은 타입의 구조체를.. 가리키는

-문서 파일에서 용어 탐색 속도를 향상하기 위하여 용어와 용어의 주소 로 만든 색인.. -특정한 키워드가 어떤 문서에서