제 9 장 포인터.

Slides:



Advertisements
Similar presentations
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
포인터란? 사전적 의미로써 지시자 혹은 가리키는 것으로 풀이할 수 있으나, C프로그래밍 언어에서는 메모리의 주소를 저장하는 변수이다. 포인터 자체가 하나의 변수이기 때문에 포인터도 메모리 내에서 선언이 되며 일반 상수를 저장하는 변수가 아닌 주소값을 저장하는 변수라는 점에서.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C++ Espresso 제3장 배열과 포인터.
제14장 동적 메모리.
Chapter 14 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
-Part2- 제3장 포인터란 무엇인가.
윤 홍 란 포인터 윤 홍 란
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
자료 구조: Chapter 3 (2)구조체, 포인터
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
포인터 활용 포인터 활용.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
23장. 구조체와 사용자 정의 자료형 2.
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 8 장 배열, 주소, 포인터.
C#.
JA A V W. 03.
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
컴퓨터 개론 및 실습 11. 동적 메모리 할당.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
Canary value 스택 가드(Stack Guard).
제 6 장 함수(functions).
데이터 동적 할당 Collection class.
Chapter 09. 포인터 1.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
7주차: Functions and Arrays
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
Chapter 11 구조체.
제 4 장 Record.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 05. 복사 생성자.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
어서와 C언어는 처음이지 제21장.
13. 포인터와 배열! 함께 이해하기.
C++ Espresso 제15장 STL 알고리즘.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

제 9 장 포인터

이번 장에서는 포인터의 기초적인 지식을 학습한다. 이번 장에서 학습할 내용 이번 장에서는 포인터의 기초적인 지식을 학습한다. 포인터이란? 변수의 주소 포인터의 선언 간접 참조 연산자 포인터 연산 포인터와 배열 포인터와 함수

포인터란? 포인터(pointer): 주소를 가지고 있는 변수

메모리의 구조 변수는 메모리에 저장된다. 메모리는 바이트 단위로 액세스된다. 첫번째 바이트의 주소는 0, 두번째 바이트는 1,…

변수와 메모리 변수의 크기에 따라서 차지하는 메모리 공간이 달라진다. char형 변수: 1바이트, int형 변수: 4바이트,…

변수의 주소 변수의 주소를 계산하는 연산자: & 변수 i의 주소: &i

변수의 주소 i의 주소: 1245024 c의 주소: 1245015 f의 주소: 1245000

포인터의 선언 포인터: 변수의 주소를 가지고 있는 변수

다양한 포인터의 선언

간접 참조 연산자 간접 참조 연산자 *: 포인터가 가리키는 값을 가져오는 연산자

간접 참조 연산자의 해석 간접 참조 연산자: 지정된 위치에서 포인터의 타입에 따라 값을 읽어 들인다.

포인터 예제 #1 i = 3000 &i = 1245024 p = 1245024 *p = 3000

포인터 예제 #2 p = 1245052 *p = 10 p = 1245048 *p = 20

포인터 예제 #3 i = 10 i = 20

중간 점검 메모리는 어떤 단위를 기준으로 주소가 매겨지는가? 다음의 각 자료형이 차지하는 메모리 공간의 크기를 쓰시오. (a) char (b) short (c) int (d) long (e) float (f) double 포인터도 변수인가? 변수의 주소를 추출하는데 사용되는 연산자는 무엇인가? 변수 x의 주소를 추출하여 변수 p에 대입하는 문장을 쓰시오. 정수형 포인터 p가 가리키는 위치에 25를 저장하는 문장을 쓰시오. 바이트(byte) (a) 1 (b) 2 (c) 4 (d) 4 (e) 4 (f) 8 포인터도 변수의 일종이다. 따라서 저장하고 있는 값의 변경이 가능하다. & 연산자 p = &x; *p = 25;

포인터 사용시 주의점 #1 초기화가 안된 포인터를 사용하면 안된다.

포인터 사용시 주의점 #2 포인터가 아무것도 가리키고 있지 않는 경우에는 NULL로 초기화 포인터의 유효성 여부 판단이 쉽다.

포인터 사용시 주의점 #3 포인터의 타입과 변수의 타입은 일치하여야 한다.

포인터를 증가시키면 가리키는 대상의 크기만큼 증가합니다. 포인터 연산 가능한 연산: 증가, 감소, 덧셈, 뺄셈 연산 증가 연산의 경우 증가되는 값은 포인터가 가리키는 객체의 크기 포인터를 증가시키면 가리키는 대상의 크기만큼 증가합니다. 포인터 타입 ++연산후 증가되는값 char 1 short 2 int 4 float double 8

증가 연산 예제 증가 전 pc = 10000, pi = 10000, pd = 10000 증가 후 pc = 10001, pi = 10004, pd = 10008 pc+2 = 10003, pi+2 = 10012, pd+2 = 10024

포인터의 증감 연산

간접 참조 연산자와 증감 연산자 수식 의미 v = *p++ p가 가리키는 값을 v에 대입한 후에 p를 증가한다.

간접 참조 연산자와 증감 연산자 i = 10, pi = 0012FF60 i = 11, pi = 0012FF60

중간 점검 포인터에 대하여 적용할 수 있는 연산에는 어떤 것들이 있는가? int형 포인터 p가 80번지를 가리키고 있었다면 (p+1)은 몇 번지를 가리키는가? p가 포인터라고 하면 *p++와 (*p)++의 차이점은 무엇인가? p가 포인터라고 하면 *(p+3)의 의미는 무엇인가? * 연산자, ++, --, +, - 연산자 84 번지를 가리킨다. *p++ : p가 가리키는 값을 사용한 후에 p를 증가 (*p)++ : p가 가리키는 값을 증가 p가 가리키는 곳에서 3번째에 있는 객체

포인터와 배열 &a[0] = 1245008 &a[1] = 1245012 &a[2] = 1245016 a = 1245008

포인터와 배열

포인터와 배열 a = 1245008 a + 1 = 1245012 *a = 10 *(a+1) = 20

포인터와 배열

포인터를 배열처럼 사용

포인터를 배열처럼 사용 a[0]=10 a[1]=20 a[2]=30 p[0]=10 p[1]=20 p[2]=30

포인터를 배열처럼 사용

중간 점검 배열의 첫 번째 원소의 주소를 계산하는 2가지 방법을 설명하라. 배열 a[]에서 *a의 의미는 무엇인가? 배열의 이름에 다른 변수의 주소를 대입할 수 있는가? 포인터를 이용하여 배열의 원소들을 참조할 수 있는가? 포인터를 배열의 이름처럼 사용할 수 있는가? (1) A (2) &A[0] 첫번째 원소의 값 대입할 수 없다. 배열의 이름은 포인터 상수라고 생각하면 된다. 즉 변경이 불가능하다. 참조할 수 있다. 사용할 수 있다. p[0], p[1] ,.. 등의 표현이 가능하다.

함수 호출시 인수 전달 방법 값에 의한 호출(call-by-value) 참조에 의한 호출(call-by-reference) 인수의 값만이 함수로 복사된다. 복사본이 전달된다고 생각하면 된다. 참조에 의한 호출(call-by-reference) C에서는 포인터를 이용하여 흉내낼 수 있다. 인수의 주소가 함수로 복사된다. 원본이 전달된다고 생각하면 된다.

값에 의한 호출

참조에 의한 호출

swap() 함수 #1 변수 2개의 값을 바꾸는 작업을 함수로 작성 a=100 b=200 변경되지 않음!! Why?

swap() 함수 #1 값들이 복사되었고 원본 변수에는 아무런 영향이 없다.

swap() 함수 #2 포인터를 이용 변경되었음!! a=100 b=200 a=200 b=100

swap() 함수 #2

2개 이상의 결과를 반환 기울기와 y-절편을 인수로 전달

2개 이상의 결과를 반환 기울기는 1.000000, y절편은 0.000000

배열이 함수 인수인 경우 일반 변수 vs 배열 참조에 의한 호출 값에 의한 호출

배열이 함수 인수인 경우 배열의 원본을 함수로 전달하는 이유: 크기가 큰 배열을 복사하려면 많은 CPU 시간 소모 따라서 배열의 경우, 배열의 주소를 전달하여서 원본을 직접 전달한다.

예제

예제

함수가 포인터를 반환하는 경우 함수는 포인터도 반환할 수 있다. 함수가 종료되더라도 남아 있는 변수의 주소를 반환하여야 한다. 지역 변수의 주소를 반환하면 , 함수가 종료되면 사라지기 때문에 오류 지역 변수 result는 함수가 종료되면 소멸되므로 그 주소를 반환하면 안된다.!!

포인터 사용의 장점 연결 리스트나 이진 트리 등의 향상된 자료 구조를 만들 수 있다. 참조에 의한 호출 동적 메모리 할당 14장에서 간단하게 학습 참조에 의한 호출 포인터를 매개 변수로 이용하여 함수 외부의 변수의 값을 변경할 수 있다. 동적 메모리 할당 14장에서 학습

중간 점검 함수에 매개 변수로 변수의 복사본이 전달되는 것을 ____________라고 한다. 함수에 매개 변수로 변수의 원본이 전달되는 것을 ____________라고 한다. 배열을 함수의 매개 변수로 지정하는 경우, 배열의 복사가 일어나는가? 값에 의한 호출(call by value) 참조에 의한 호출(call by reference) 배열은 복사되지 않고 원본이 전달된다.

함수 포인터 함수 포인터(function pointer): 함수를 가리키는 포인터 (예) int (*pf)(int, int); 반환형 (*함수포인터이름) (매개변수1, 매개변수2, ...);

함수 포인터

fp1.c

fp1.c 10+20은 30 10-20은 -10

중간 점검 double 형 매개 변수를 가지며 double형의 값을 반환하는 함수 포인터 pf를 선언하여 보자. double (*pf) (doube);

Q & A