쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)

Slides:



Advertisements
Similar presentations
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
Advertisements

포인터란? 사전적 의미로써 지시자 혹은 가리키는 것으로 풀이할 수 있으나, C프로그래밍 언어에서는 메모리의 주소를 저장하는 변수이다. 포인터 자체가 하나의 변수이기 때문에 포인터도 메모리 내에서 선언이 되며 일반 상수를 저장하는 변수가 아닌 주소값을 저장하는 변수라는 점에서.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
Power C++ 제6장 포인터와 문자열.
제 9 장 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C++ Espresso 제3장 배열과 포인터.
배열, 포인터 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
-Part2- 제3장 포인터란 무엇인가.
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
윤 홍 란 포인터 윤 홍 란
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
자료 구조: Chapter 3 (2)구조체, 포인터
6장. printf와 scanf 함수에 대한 고찰
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
자료 구조: Chapter 3 (2)구조체, 포인터
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
포인터 활용 포인터 활용.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
13. 연산자 오버로딩.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
상수와 기본 자료형.
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
제어문 & 반복문 C스터디 2주차.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그램 제2,3장 간단한 C 프로그램 김 문 기.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
8주차: Strings, Arrays and Pointers
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
18장. 다차원 배열 그리고 포인터.
제 6 장 함수(functions).
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
7주차: Functions and Arrays
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Summary of Pointers and Arrays
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
어서와 C언어는 처음이지 제21장.
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)

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

변수의 주소 변수의 주소를 계산하는 연산자: & 변수 i의 주소: &i Slide 3 (of 27)

변수의 주소 int main(void) { int i = 10; char c = 69; float f = 12.3; printf("i의 주소: %u\n", &i); // 변수 i의 주소 출력 printf("c의 주소: %u\n", &c); // 변수 c의 주소 출력 printf("f의 주소: %u\n", &f); // 변수 f의 주소 출력 return 0; } i의 주소: 1245024 c의 주소: 1245015 f의 주소: 1245000 Slide 4 (of 27)

포인터의 선언 포인터: 변수의 주소를 가지고 있는 변수 int i = 10; // 정수형 변수 i 선언 int *p = &i; // 변수 i의 주소가 포인터 p로 대입 Slide 5 (of 27)

다양한 포인터의 선언 char c = 'A'; // 문자형 변수 c float f = 36.5; // 실수형 변수 f double d = 3.141592; // 실수형 변수 d char *pc = &c; // 문자를 가리키는 포인터 pc float *pf = &f; // 실수를 가리키는 포인터 pf double *pd = &d; // 실수를 가리키는 포인터 pd Slide 6 (of 27)

간접 참조 연산자 간접 참조 연산자 *: 포인터가 가리키는 값을 가져오는 연산자 int i = 10; int *p = &i; printf("%d\n", *p); // 10이 출력된다. *p = 20; printf("%d\n", *p); // 20이 출력된다. Slide 7 (of 27)

간접 참조 연산자의 해석 간접 참조 연산자: 지정된 위치에서 포인터의 타입에 따라 값을 읽어 들인다. int *p = 8; // 위치 8에서 정수를 읽는다. char *pc = 8; // 위치 8에서 문자를 읽는다. double *pd = 8; // 위치 8에서 실수를 읽는다. Slide 8 (of 27)

포인터 예제 #1 #include <stdio.h> int main(void) { int i = 3000; int *p = &i; // 변수와 포인터 연결 printf("&i = %u\n", &i); // 변수의 주소 출력 printf("p = %u\n", p); // 포인터의 값 출력 printf("i = %d\n", i); // 변수의 값 출력 printf("*p = %d\n", *p); // 포인터를 통한 간접 참조 값 출력 return 0; } &i = 1245024 p = 1245024 i = 3000 *p = 3000 Slide 9 (of 27)

포인터 예제 #2 #include <stdio.h> int main(void) { char c = 'A'; // 문자형 변수 정의 int i = 10000; // 정수형 변수 정의 double d = 6.78; // 실수형 변수 정의 char *pc = &c; // 문자형 포인터 정의 및 초기화 int *pi = &i; // 정수형 포인터 정의 및 초기화 double *pd = &d; // 실수형 포인터 정의 및 초기화 (*pc)++; // 간접 참조로 1 증가 *pi = *pi + 1; // 간접 참조로 1 증가 *pd += 1; // 간접 참조로 1 증가 printf("c = %c\n", c); printf("i = %d\n", i); printf("d = %f\n", d); return 0; } *pc++라고 하면 안됨 c = B i = 10001 d = 7.780000 Slide 10 (of 27)

포인터 사용시 주의점 #1 포인터의 타입과 변수의 타입은 일치하여야 한다. #include <stdio.h> int main(void) { int i; double *pd; pd = &i; // 오류! double형 포인터에 int형 변수의 주소를 대입 *pd = 36.5; return 0; } Slide 11 (of 27)

포인터 사용시 주의점 #2 초기화가 안된 포인터를 사용하면 안된다. int main(void) { int *p; // 포인터 p는 초기화가 안되어 있음 *p = 100; // 위험한 코드 return 0; } Slide 12 (of 27)

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

포인터의 증가는 일반 변수와는 약간 다릅니다. 가리키는 객체의 크기만큼 증가합니다. 포인터 연산 가능한 연산: 증가, 감소, 덧셈, 뺄셈 연산 증가 연산의 경우 증가되는 값은 포인터가 가리키는 객체의 크기 포인터 타입 ++연산후 증가되는값 char 1 short 2 int 4 float double 8 포인터의 증가는 일반 변수와는 약간 다릅니다. 가리키는 객체의 크기만큼 증가합니다. Slide 14 (of 27)

증가 연산 예제 // 포인터의 증감 연산 #include <stdio.h> int main(void) { char *pc; int *pi; double *pd; pc = (char *)10000; pi = (int *)10000; pd = (double *)10000; printf("증가 전 pc = %d, pi = %d, pd = %d\n", pc, pi, pd); pc++; pi++; pd++; printf("증가 후 pc = %d, pi = %d, pd = %d\n", pc, pi, pd); return 0; } 증가 전 pc = 10000, pi = 10000, pd = 10000 증가 후 pc = 10001, pi = 10004, pd = 10008 Slide 15 (of 27)

간접 참조 연산자와 증감 연산자 수식 의미 v = *p++ p가 가리키는 값을 v에 대입한 후에 p를 증가한다. // 포인터의 증감 연산 #include <stdio.h> int main(void) { int i = 10; int *pi = &i; printf("i = %d, pi = %p\n", i, pi); (*pi)++; *pi++; return 0; } i = 10, pi = 0012FF60 i = 11, pi = 0012FF60 i = 11, pi = 0012FF64 Slide 16 (of 27)

포인터와 배열 // 포인터와 배열의 관계 #include <stdio.h> int main(void) { int a[] = { 10, 20, 30, 40, 50 }; printf("&a[0] = %u\n", &a[0]); printf("&a[1] = %u\n", &a[1]); printf("&a[2] = %u\n", &a[2]); printf("a = %u\n", a); return 0; } &a[0] = 1245008 &a[1] = 1245012 &a[2] = 1245016 a = 1245008 Slide 17 (of 27)

포인터와 배열 // 포인터와 배열의 관계 #include <stdio.h> int main(void) { int a[] = { 10, 20, 30, 40, 50 }; printf("a = %u\n", a); printf("a + 1 = %u\n", a + 1); printf("*a = %d\n", *a); printf("*(a+1) = %d\n", *(a+1)); return 0; } a = 1245008 a + 1 = 1245012 *a = 10 *(a+1) = 20 Slide 18 (of 27)

포인터를 배열처럼 사용 // 포인터를 배열 이름처럼 사용 #include <stdio.h> int main(void) { int a[] = { 10, 20, 30, 40, 50 }; int *p; p = a; printf("a[0]=%d a[1]=%d a[2]=%d \n", a[0], a[1], a[2]); printf("p[0]=%d p[1]=%d p[2]=%d \n\n", p[0], p[1], p[2]); p[0] = 60; p[1] = 70; p[2] = 80; printf("p[0]=%d p[1]=%d p[2]=%d \n", p[0], p[1], p[2]); return 0; } a[0]=10 a[1]=20 a[2]=30 p[0]=10 p[1]=20 p[2]=30 a[0]=60 a[1]=70 a[2]=80 p[0]=60 p[1]=70 p[2]=80 Slide 19 (of 27)

포인터와 함수 C에서의 인수 전달 방법 값에 의한 호출: 기본적인 방법 참조에 의한 호출: 포인터 이용 Slide 20 (of 27)

swap() 함수 #1 변수 2개의 값을 바꾸는 작업을 함수로 작성 #include <stdio.h> void swap(int x, int y); int main(void) { int a = 100, b = 200; printf("main() a=%d b=%d\n",a, b); swap(a, b); return 0; } void swap(int x, int y) { int tmp; printf("swap() x=%d y=%d\n",x, y); tmp = x; x = y; y = tmp; } main() a=100 b=200 swap() x=100 y=200 swap() x=200 y=100 Slide 21 (of 27)

swap() 함수 #2 포인터를 이용 #include <stdio.h> void swap(int x, int y); int main(void) { int a = 100, b = 200; printf("main() a=%d b=%d\n",a, b); swap(&a, &b); return 0; } void swap(int *px, int *py) { int tmp; printf("swap() *px=%d *py=%d\n", *px, *py); tmp = *px; *px = *py; *py = tmp; } main() a=100 b=200 swap() *px=100 *py=200 swap() *px=200 *py=100 main() a=200 b=100 Slide 22 (of 27)

2개 이상의 결과를 반환 #include <stdio.h> // 기울기와 y절편을계산 int get_line_parameter(int x1, int y1, int x2, int y2, float *slope, float *yintercept) { if( x1 == x2 ) return -1; else { *slope = (float)(y2 - y1)/(float)(x2 - x1); *yintercept = y1 - (*slope)*x1; return 0; } int main(void) float s, y; if( get_line_parameter(3, 3, 6, 6, &s, &y) == -1 ) printf("에러\n"); else printf("기울기는 %f, y절편은 %f\n", s, y); 기울기와 y-절편을 인수로 전달 기울기는 1.000000, y절편은 0.000000 Slide 23 (of 27)

배열이 함수 인수인 경우 일반 변수 vs 배열 배열의 경우, 크기가 큰 경우에 복사하려면 많은 시간 소모 배열의 경우, 배열의 주소를 전달 // 매개 변수 x에 기억 장소가 할당된다. void sub(int x) { ... } // 매개 변수 b[]에 기억 장소가 할당되지 않는다. void sub(int b[], int n) { ... } Slide 24 (of 27)

예제 // 포인터와 함수의 관계 #include <stdio.h> void sub(int b[], int n); int main(void) { int a[3] = { 1,2,3 }; printf("%d %d %d\n", a[0], a[1], a[2]); sub(a, 3); return 0; } void sub(int b[], int n) b[0] = 4; b[1] = 5; b[2] = 6; 1 2 3 4 5 6 Slide 25 (of 27)

주의 함수가 종료되더라도 남아 있는 변수의 주소를 반환하여야 한다. 지역 변수의 주소를 반환하면 , 함수가 종료되면 사라지기 때문에 오류 int *add(int x, int y) { int result; result = x + y; return &result; } 지역 변수 result는 함수가 종료되면 소멸되므로 그 주소를 반환하면 안된다.!! Slide 26 (of 27)

Q & A Slide 27 (of 27)