Chapter 10. 포인터.

Slides:



Advertisements
Similar presentations
03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
Advertisements

제6장 조건문.
데이터의 표현과 연산 (1) (Chapter 3)
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
쉽게 풀어쓴 C언어 Express 제5장 수식과 연산자 C Express Slide 1 (of 34)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
C 6장. 함수 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
제5장 제어명령
C언어: 배열 (Arrays).
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
6장. printf와 scanf 함수에 대한 고찰
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
7. while 문의 흐름 제어.
8장 포인터.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
컴퓨터 프로그래밍 기초 - 2nd : scanf(), printf() 와 연산자 -
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
Chapter 06. 선택문.
변수와 자료형.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
제 3 장 상수와 변수
프로그래밍실습 제 13 강.
C 4장. 연산자 #include <stdio.h> int main(void) { int num;
13. 포인터와 배열! 함께 이해하기.
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
Chapter 10 함수 기본.
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
제어문 & 반복문 C스터디 2주차.
CHAP 2:순환.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터 프로그램 제2,3장 간단한 C 프로그램 김 문 기.
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
Chapter 11. 배열과 포인터.
Chapter 04. 데이터의 표현과 연산(Ⅱ).
Chapter 05. 입출력 함수.
Byte Alignment ㈜ 웰컴정보시스템 김 정 은.
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
제 3장 데이터형과 연산자 Hello!! C 언어 강성호 김학배 최우영.
포인터.
-Part2- 제1장 1차원 배열이란 무엇인가.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
-Part1- 제7장 반복문이란 무엇인가.
18장. 다차원 배열 그리고 포인터.
-Part1- 제8장 조건문이란 무엇인가 (교재 199페이지 ~ 224페이지)
뇌를 자극하는 C 프로그래밍.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
컴퓨터 프로그램은 여러 기능의 복합체이다. 라이브러리 함수와 사용자 정의 함수
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
C언어 프로그래밍의 이해 Ch03. 기본 자료형, 변수와 상수.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
어서와 C언어는 처음이지 제16장.
17장. 포인터의 포인터.
C 4장. 연산자 #include <stdio.h> int main(void) { int num;
C.
개정판 누구나 즐기는 C언어 콘서트 제3장 변수와 자료형 출처: pixabay.
Chapter 09. 배열.
어서와 C언어는 처음이지 제22장.
3b장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
11장. 1차원 배열.
Presentation transcript:

chapter 10. 포인터

포인터의 정의와 사용 변수를 선언하는 것은 메모리에 기억공간을 할당하는 것이며 할당된 이후에는 변수명으로 그 기억공간을 사용한다. 할당된 기억공간을 사용하는 방법에는 변수명 외에 메모리의 실제 주소값을 사용하는 것이다. 이 주소값을 포인터라고 한다.

메모리에는 바이트(byte)단위로 그 위치를 식별할 수 있는 물리적인 주소값이 있다. ▶ 포인터란 무엇인가? 메모리에는 바이트(byte)단위로 그 위치를 식별할 수 있는 물리적인 주소값이 있다. - 메모리의 용량이 64kb라면 주소값은 0번지부터 65535번지까지 존재한다.

▶ 포인터란 무엇인가? 변수를 선언하면 그 자료형의 크기만큼 메모리에 연속된 바이트의 기억공간이 할당되는데 그 첫번째 바이트의 주소값이 포인터이다. 이 포인터를 사용하여 4바이트의 기억공간에 값을 저장하거나 저장된 값을 꺼내어 쓸 수 있다.

특정 변수의 포인터를 구하기 위해서는 주소연산자(&)를 사용한다. ▶ 포인터를 구하자(주소연산자) 특정 변수의 포인터를 구하기 위해서는 주소연산자(&)를 사용한다. 포인터를 구하여 출력해 보자. char ch; int in; double db; printf(“ch의 포인터 : %u\n”, &ch); printf(“in의 포인터 : %u\n”, &in); printf(“db의 포인터 : %u\n”, &db); ch의 포인터 : 1245052 in의 포인터 : 1245048 db의 포인터 : 1245040 // char형 변수의 주소값 // int형 변수의 시작 주소값 // double형 변수의 시작 주소값

포인터에는 자신이 어떤 자료형으로부터 만들어졌는지에 대한 정보를 가지고 있다. ▶ 포인터는 특정 자료형을 가리킨다. 포인터에는 자신이 어떤 자료형으로부터 만들어졌는지에 대한 정보를 가지고 있다. 포인터 값 혈통에 대한 정보 &ch 1245052 “나는 char형 기억공간의 주소값이다!” &in 1245048 “나는 int형 기억공간의 시작 주소값이다!” &db 1245040 “나는 double형 기억공간의 시작 주소값이다!” 포인터가 특정 자료형에 대한 정보를 가지고 있다는 것을 간단히 표현할 때 “가리킨다”고 하고 화살표를 사용하여 그림을 그린다.

포인터를 통해서 기억공간을 사용하기 위해서는 참조연산자(*)를 사용한다. ▶ 포인터를 사용하자(참조연산자) 포인터를 통해서 기억공간을 사용하기 위해서는 참조연산자(*)를 사용한다. char ch; int in; double db; *&ch = ‘P’; *&in = 100; *&db = 3.14; printf(“변수 ch에 저장된 문자 : %c\n”, ch); printf(“변수 in에 저장된 값 : %d\n”, in); printf(“변수 db에 저장된 값 : %lf\n”, db); // 포인터 &ch가 가리키는 기억공간에 ‘P’를 저장한다. // 포인터 &in이 가리키는 기억공간에 100을 저장한다. // 포인터 &db가 가리키는 기억공간에 3.14를 저장한다. 변수 ch에 저장된 문자 : P 변수 in에 저장된 값 : 100 변수 db에 저장된 값 : 3.140000

“참조”는 기억공간 뿐만 아니라 기억공간에 저장된 값도 사용한다. ▶ 포인터를 사용하자(참조연산자) “참조”는 기억공간 뿐만 아니라 기억공간에 저장된 값도 사용한다. int a=100, b=0; b = *&a; // 포인터 &a가 가리키는 기억공간의 값을 b에 대입한다. printf(“b의 값 : %d\n”, b); 기억공간을 사용하는 것과 값을 사용하는 것은 대입연산자의 어디에 위치하느냐에 따라 결정된다. int a=10, b=20; *&a = *&b; // 변수 b에 저장된 값을 변수 a의 기억공간에 저장한다. printf(“a의 값 : %d\n”, a); // a의 값은 20이 출력된다.

포인터의 값 자체는 정수값이지만 가리키는 자료형에 대한 정보를 가지고 있으므로 정수형 변수에 저장할 수 없다. ▶ 포인터를 저장하자(포인터변수) 포인터의 값 자체는 정수값이지만 가리키는 자료형에 대한 정보를 가지고 있으므로 정수형 변수에 저장할 수 없다. int a; int ap; ap = &a; // 포인터를 구할 변수 // 포인터를 저장할 변수 // a의 포인터를 구해서 ap에 저장한다. 직관적으로는 충분히 가능할 듯 하지만 컴파일에러가 발생한다. error C2440: ‘=’ : cannot convert from ‘int *’ to ‘int’

▶ 포인터를 저장하자(포인터변수) 포인터는 포인터가 가진 정보를 그대로 보존할 수 있도록 포인터변수에 저장해야 한다. 포인터변수는 변수명 앞에 ‘*’을 붙이고 가리키는 자료형을 앞에 적어준다. - int형 변수의 포인터를 저장하는 포인터변수의 선언 포인터변수가 포인터를 저장하면 포인터와 마찬가지로 기억공간을 가리킨다. int a; int *ap; ap = &a;

▶ 포인터변수를 사용한 참조 포인터를 저장한 포인터변수도 참조연산자로 그 것이 가리키는 기억공간 또는 그 기억공간의 값을 사용할 수 있다. int a; int ap = &a; *ap = 10; // int형 변수의 선언 // 포인터변수의 선언과 동시에 초기화, ap는 변수 a를 가리킨다. // 포인터변수가 가리키는 기억공간에 10을 저장한다. 포인터변수도 하나의 변수이므로 주소연산자로 메모리에서의 위치를 구할 수 있다. int a; int ap = &a; printf(“ap에 저장된 값 : %u\n”, ap); printf(“ap자체의 주소값 : %u\n”, &ap); // int형 변수의 선언 // 포인터변수의 선언과 동시에 초기화, ap는 변수 a를 가리킨다. // 변수 a의 시작주소값 출력 // 포인터변수 ap의 시작주소값 출력

▶ 포인터 정리 int a = 10; int *ap = &a; // int형 변수 선언, 정수값 10으로 초기화 printf(“%d”, a); printf(“%d”, *ap); printf(“%u”, &a); printf(“%u”, ap); printf(“%u”, &ap); // ①번 출력, a에 저장된 정수값 10 // ①번 출력, ap가 가리키는 곳에 저장된 값 10 // ②번 출력, a의 시작주소값 52번지 // ③번 출력, ap에 저장된 주소값 52번지 // ④번 출력, 포인터변수 ap의 시작주소값 48번지

함수들은 독립된 기억공간을 가지므로 다른 함수에 선언된 변수를 사용할 수 없다. 포인터의 필요성 함수들은 독립된 기억공간을 가지므로 다른 함수에 선언된 변수를 사용할 수 없다. - assign함수를 호출하여 메인함수에 있는 cheoli변수에 값을 할당하는 예 #include <stdio.h> void assign(); int main() { int cheoli=0; assign(); printf("함수가 호출된 후에 cheoli에 저장된 값 : %d\n", cheoli); return 0; } void assign() cheoli=100; 함수가 호출된 후에 cheoli에 저장된 값 : 0

▶ 포인터로 다른 함수의 기억공간을 사용한다. assign함수가 main함수의 cheoli변수를 사용하기 위해서는 메모리에서의 위치(포인터)를 알아야 한다. #include <stdio.h> void assign(); int main() { int cheoli=0; assign(&cheoli); printf("함수가 호출된 후에 cheoli에 저장된 값 : %d\n", cheoli); return 0; } void assign(int *ip) *ip=100;

▶ 함수의 한계를 극복한다. 함수는 전달인자가 많아도 리턴되는 값은 오직 하나이다. 따라서 메인함수에 있는 두 변수의 값을 바꾸는 함수는 포인터를 사용해야 한다. #include <stdio.h> void exchange(int *, int *); int main() { int cheoli=10, metel=20; exchange(&cheoli, &metel); return 0; } void exchange(int *cp, int *mp) int temp; temp=*cp; *cp=*mp; *mp=temp;

- 컴파일러마다 다를 수 있으므로 sizeof연산자로 계산한다. 포인터에 관한 중요한 질문 포인터와 포인터변수의 크기는 몇 바이트인가? - 컴파일러마다 다를 수 있으므로 sizeof연산자로 계산한다. int in; int *ip = &in; printf(“int형 변수의 포인터의 크기 : %d\n”, sizeof(&in)); printf(“int형 변수를 가리키는 포인터변수의 크기 : %d\n”, sizeof(ip)); - 포인터와 포인터변수의 크기는 가리키는 자료형과는 관계없이 항상 같다. char ch; int in; double db; char *cp = &ch; int *ip = &in; double *dp = &db; printf(“%d, %d, %d\n”, sizeof(cp), sizeof(ip), sizeof(dp)); sizeof((*cp), sizeof(*ip), sizeof(*dp)); // 결과는 4, 4, 4 // 결과는 1, 4, 8

포인터와 포인터변수는 자동 형변환이 가능한가? - 기본자료형은 자동형변환이 가능하나 포인터(변수)는 불가능하다. 포인터에 관한 중요한 질문 포인터와 포인터변수는 자동 형변환이 가능한가? - 기본자료형은 자동형변환이 가능하나 포인터(변수)는 불가능하다. (형변환 연산자를 사용한 명시적 형변환은 가능하다.) int *ip; double db=6.5; ip=&db; // int형 변수를 가리키는 포인터변수 // double형 변수 // double형 변수의 포인터를 int형 포인터변수에 대입 컴파일 에러 error C2440: ‘=’ : cannot convert from ‘double *’ to ‘int *’ 자동 형변환이 가능하다면 정수값이 저장된 기억공간에서 실수값을 참조하는 오류를 범하게 될 것이다. 포인터의 형변환 규칙은 함수의 전달인자와 매개변수 사이에도 적용된다.