개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.

Slides:



Advertisements
Similar presentations
1.1 구조체란 1.2 중첩 구조체 1.3 구조체와 배열 1.4 구조체와 포인터 1.5 구조체와 함수 1.6 공용체와 열거형.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
포인터란? 사전적 의미로써 지시자 혹은 가리키는 것으로 풀이할 수 있으나, C프로그래밍 언어에서는 메모리의 주소를 저장하는 변수이다. 포인터 자체가 하나의 변수이기 때문에 포인터도 메모리 내에서 선언이 되며 일반 상수를 저장하는 변수가 아닌 주소값을 저장하는 변수라는 점에서.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C++ Espresso 제3장 배열과 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제14장 동적 메모리.
Chapter 14 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제 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 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
누구나 즐기는 C언어 콘서트 제8장 배열.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C 프로그래밍.
Dynamic Memory and Linked List
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
포인터 활용 포인터 활용.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
제8장 배열 1부 8.1 배열 8.2 배열의 초기화 8.3 배열의 응용 8.4 정렬과 탐색 8.5 다차원 배열.
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 8 장 배열, 주소, 포인터.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
제 6 장 함수(functions).
Chapter 09. 포인터 1.
7주차: Functions and Arrays
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
C++ Espresso 제15장 STL 알고리즘.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay

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

이번 장에서 만들 프로그램

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

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

변수와 메모리 변수의 크기에 따라서 차지하는 메모리 공간이 달라진다. char형 변수: 1바이트, int형 변수: 4바이트,… int main(void) { int i = 10; char c = 69; float f = 12.3; }

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

변수의 주소 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; }

포인터의 선언 포인터: 변수의 주소를 가지고 있는 변수 *p가 가리키는 내용은 정수가 된다.

포인터와 변수의 연결 int number = 10; // 정수형 변수 number 선언 int *p; // 포인터 변수 p 선언 p = &number; // 변수 number의 주소가 포인터 p로 대입

포인터와 변수 포인터 p가 변수 number를 가리킨다. int number = 10; // 정수형 변수 number 선언 int *p; // 포인터 변수 p 선언 p = &number; // 변수 number의 주소가 포인터 p로 대입

간접 참조 연산자 간접 참조 연산자 *: 포인터가 가리키는 값을 가져오는 연산자 int i=10; int *p; p =&i; printf(“%d”, *p):

포인터 연산자

& 연산자와 * 연산자 & 연산자: 변수의 주소를 반환한다 * 연산자: 포인터가 가리키는 곳의 내용을 반환한다.

예제 #1 #include <stdio.h> int main(void) { int number = 10; int *p; p = &number; printf("변수 number의 주소 = %u\n", &number); printf("포인터의 값 = %u\n", p); printf("변수 number의 값 = %d\n", number); printf("포인터가 가리키는 값 = %d\n", *p); return 0; }

예제 #2 #include <stdio.h> int main(void) { int number = 10; int *p; p = &number; printf("변수 number의 값 = %d\n", number); *p = 20; return 0; }

중간 점검 메모리는 어떤 단위를 기준으로 주소가 매겨지는가? 포인터도 변수인가? 변수의 주소를 추출하는데 사용되는 연산자는 무엇인가? 변수 x의 주소를 추출하여 변수 p에 대입하는 문장을 쓰시오. 정수형 포인터 p가 가리키는 위치에 25를 저장하는 문장을 쓰시오.

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

증가 연산 예제 #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); printf("pc+2 = %d, pi+2 = %d, pd+2 = %d\n", pc+2, pi+2, pd+2); return 0; }

포인터의 증감 연산

간접 참조 연산자와 증감 연산자 *p++; p가 가리키는 위치에서 값을 가져온 후에 p를 증가한다. (*p)++; 수식 의미 v = *p++ p가 가리키는 값을 v에 대입한 후에 p를 증가한다. v = (*p)++ p가 가리키는 값을 v에 대입한 후에 가리키는 값을 증가한다. v = *++p p를 증가시킨 후에 p가 가리키는 값을 v에 대입한다. v = ++*p p가 가리키는 값을 가져온 후에 그 값을 증가하여 v에 대입한다.

함수와 포인터 다른 사람에게 넘겨주어야 하는 정보가 상당히 방대하다고 하자. 이 런 경우에는 전체를 복사해서 주는 것보다는 페이지 수만 알려주는 편이 간결할 수 있다.

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

값에 의한 호출 #include <stdio.h> void modify(int value) { value = 99; } int main(void) int number = 1; modify(number); printf("number = %d\n", number); return 0;

참조에 의한 호출 #include <stdio.h> void modify(int *ptr) { } int main(void) int number = 1; modify(&number); // 주소를 계산해서 보낸다. printf("number = %d\n", number); return 0;

swap() 함수 #1 변수 2개의 값을 바꾸는 작업을 함수로 작성 int main(void) { int a = 10, b = 20; swap(a, b); printf(“swap() 호출후 a=%d b=%d\n",a, b); return 0; } void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; }

swap() 함수 #2 포인터를 이용 int main(void) { int a = 100, b = 200; printf(“swap() 호출 전 a=%d b=%d\n",a, b); swap(&a, &b); printf(“swap() 호출 후 a=%d b=%d\n",a, b); return 0; } void swap(int *px, int *py) { int tmp; tmp = *px; *px = *py; *py = tmp; }

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

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

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

포인터와 배열 배열과 포인터는 아주 밀접한 관계를 가지고 있다. 배열 이름이 바로 포인터이다. 포인터는 배열처럼 사용이 가능하다.

포인터와 배열 #include <stdio.h> int main(void) { int a[] = { 10, 20, 30, 40, 50 }; printf("배열의 이름 = %u\n", a); printf("첫 번째 원소의 주소 = %u\n", &a[0]); return 0; }

포인터를 배열처럼 사용 포인터도 배열이름처럼 간주될 수 있고 배열과 똑같이 사용할 수 있 다.

포인터와 배열 #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]); return 0; }

어디에 사용될까? #include <stdio.h> void sub(int *ptr) { printf("%d \n", ptr[10]); } int main(void) int large_data[]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; sub(large_data); return 0;

Lab: 유용한 배열 함수 작성 정수 배열에 대하여 평균을 계산하고 배열을 출력하는 함수를 작성 하고 사용해보자. double get_array_avg(int values[], int n); 정수 배열을 받아서 배열 요소의 평균값을 계산하여 반환한다. void print_array(int values[], int n); 정수 배열을 받아서 배열 요소들을 출력한다.

Sol: #include <stdio.h> #define SIZE 5 double get_array_avg(int values[], int n); void print_array(int values[], int n); int main(void) { int i; int data[SIZE] = { 10, 20, 30, 40, 50 }; double result; print_array(data, SIZE); result = get_array_avg(data, SIZE); printf("배열 원소들의 평균 = %f\n", result); return 0; }

Sol: // 배열 요소의 평균을 계산하는 함수 double get_array_avg(int values[], int n) { int i; double sum = 0.0; for (i = 0; i < n; i++) sum += values[i]; return sum / n; } // 배열 요소를 화면에 출력하는 함수 void print_array(int values[], int n) printf("[ "); printf("%d ", values[i]); printf("]\n");

Q & A