C 프로그래밍.

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 구조체 정의  구조체란 ? o 서로 다른 형의 변수들을 하나로 묶어주는 mechanism. (cf. 배열 : 같은 형의 변수들을 하나로 묶어주는 mechanism) o 예 : 카드의.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
쉽게 풀어쓴 C언어 Express 제11장 포인터 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;
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
6장. printf와 scanf 함수에 대한 고찰
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
5장. 참조 타입.
컴퓨터 프로그래밍 기초 - 2nd : scanf(), printf() 와 연산자 -
C 프로그래밍.
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
포인터 활용 포인터 활용.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
상수와 기본 자료형.
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
컴퓨터 프로그램 제2,3장 간단한 C 프로그램 김 문 기.
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
포인터.
-Part2- 제1장 1차원 배열이란 무엇인가.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Chapter 09. 포인터 1.
-Part2- 제2장 다차원 배열이란 무엇인가.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

C 프로그래밍

-Part2- 제3장 포인터란 무엇인가

학습목차 3. 1 포인터란 3. 2 포인터 변수의 선언과 사용 3. 3 다차원 포인터 변수의 선언과 사용 3. 4 주소의 가감산 3. 5 함수 포인터

3.1 포인터란

‘포인터’를 공부하기 전에… 택배 아저씨가 하는 일 고객의 주소를 저장하고 있다가 해당 주소로 물건을 전달하는 일 고객의 주소를 저장하고 있다가 해당 주소로 물건을 받아가는 일 ‘우리에게 ‘간접 접근’ 서비스를 제공한다.’ 택배 아저씨가 있어서 우리가 편리한 점 ‘물품을 수령하기 위해 직접 구매처를 방문 하지 않아도 된다.’ ‘반품을 위해 직접 구매처를 방문 하지 않아도 된다.’ 컴퓨팅 세계에서 택배 아저씨와 같은 일을 하는 변수 포인터 변수 (포인터라고도 부름) 메모리의 주소를 저장하고 있다가 해당 주소로 데이터를 전달 하는 일 메모리의 주소를 저장하고 있다가 해당 주소로 데이터를 참조 하는 일

3.1 포인터란 ‘포인터’란? ‘주소를 저장하는 변수이다.’ ‘C언어의 장점 중에 하나가 바로 포인터(포인터 변수)이다.’ ‘포인터’를 사용하면 어떤 장점이 있는가? 메모리 주소를 참조해서 다양한 자료형 변수들의 접근과 조작 용이 현재 ‘장’에서 배울 예정 메모리 주소를 참조하여 배열과 같은 연속된 데이터에 접근과 조작 용이 PART2-4장에서 배움 동적 할당된 메모리 영역(힙영역)에 접근과 조작 용이 PART3-4장에서 배움

3.2 포인터 변수의 선언과 사용

3.2 포인터 변수의 선언과 사용 (1/8) 포인터 변수의 선언 자료형: 포인터 변수의 자료형 지정, 자료형 다음에 * 연산자를 붙임 포인터 변수 이름: 주소를 저장할 변수의 이름 지정 NULL 포인터 설정: 포인터 변수 선언 시 NULL로 초기화 int* p1=NULL; // int형 주소를 저장하는 포인터 변수 char* p2=NULL; // char형 주소를 저장하는 포인터 변수 double* p3=NULL; // double형 주소를 저장하는 포인터 변수

3.2 포인터 변수의 선언과 사용 (2/8)---[3-2.c 실습] #include <stdio.h> int main(void) { // 포인터 변수 선언 char* cp=NULL; int* ip=NULL; printf("%x %x %x\n", &cp, cp, *&cp); printf("%x %x %x\n", &ip, ip, *&ip); printf("%d %d \n", sizeof(char*), sizeof(int*)); // 4, 4 출력 printf("%d %d \n", sizeof(cp), sizeof(ip)); // 4, 4 출력 return 0; } cp==*&cp ip==*&ip &cp &ip ‘모든 포인터 변수는 4바이트 이다.’

&c A 3.2 포인터 변수의 선언과 사용 (3/8)---[3-3.c 실습] c == *&c == *cp #include <stdio.h> int main( ) { char c='A'; char* cp=NULL; cp=&c; // 주소 저장 printf("%x %c %c \n", &c, c, *&c); printf("%x %x %x \n", &cp, cp, *&cp); printf("%c \n", c); // 직접 접근 printf("%c \n", *cp); // 간접 접근 return 0; } &c &cp cp==*&cp A c==*&c 같은 메모리 공간의 이름 c == *&c == *cp

&a &c &b 30 20 10 3.2 포인터 변수의 선언과 사용 (4/8)---[3-4.c 실습] #include <stdio.h> int main( ) { int a=0, b=0, c=0; int* ip=NULL; // 포인터 변수 선언 ip=&a; // 주소 저장 *ip=10; printf("%d %d %d %d\n", a, b, c, *ip); ip=&b; // 주소 저장 변경 *ip=20; ip=&c; // 주소 저장 변경 *ip=30; return 0; } &a &ip ip &c &b &c c 30 &b b 20 &a a 10

10 3.2 포인터 변수의 선언과 사용 (5/8)---[3-5.c 실습] #include <stdio.h> int main( ) { int num=10; int* ip=NULL; // 포인터 변수 선언 ip=&num; // 주소 저장 printf("%x %x %d \n", &*&ip, *&ip, **&ip); printf("%x %x %d \n", &ip, ip, *ip); return 0; } &num &ip ip 10 num==*ip *&는 서로 상쇄

3.2 포인터 변수의 선언과 사용 (6/8)---[3-6.c 실습] &ip ip #include <stdio.h> int main( ) { int num1=10; int num2=0; int* ip=NULL; // 포인터 변수 선언 ip=&num1; // 주소 저장 num2=*ip+num1; printf("%d %d %d\n", *ip, num1, num2); return 0; } &num2 num2 &num1 num1 그림 그려 볼 것

3.2 포인터 변수의 선언과 사용 (7/8) 잘못 사용된 포인터 ① 포인터 변수에 주소를 저장하지 않은 경우 #include <stdio.h> int main(void) { int* ip=NULL; *ip=10000; return 0; } ① 포인터 변수에 주소를 저장하지 않은 경우 #include <stdio.h> int main(void) { int* ip=14592343; *ip=1020; return 0; } ② 포인터 변수에 이상한 주소 저장

== 3.2 포인터 변수의 선언과 사용 (8/8) 포인터 변수의 초기화 방법 2 가지 #include <stdio.h> int main(void) { int num=10; int* ip=NULL; ip=&num; return 0; } #include <stdio.h> int main(void) { int num=10; int* ip=&num; return 0; } 같은 표현 == 포인터 변수의 선언과 초기화를 개별적으로 수행 포인터 변수의 선언과 초기화를 동시에 수행

3.3 다차원 포인터 변수의 선언과 사용

3.3 다차원 포인터 변수의 선언과 사용 (1/11) 다차원 포인터 변수란? ‘2차원 이상의 포인터 변수를 의미한다.’

10 3.3 다차원 포인터 변수의 선언과 사용 (2/11) 1차원 포인터 변수의 역할: 일반 변수의 주소를 저장 #include <stdio.h> int main(void) { int num=10; int* p1=NULL; p1=&num; return 0; } &num &p1 p1 10 num==*p1

10 3.3 다차원 포인터 변수의 선언과 사용 (3/11) 2차원 포인터 변수의 역할: 1차원 포인터 변수의 주소를 저장 #include <stdio.h> int main(void) { int num=10; int* p1=NULL; int** p2=NULL; p1=&num; p2=&p1; return 0; } &num &p1 p1 10 num &p2 p2

10 3.3 다차원 포인터 변수의 선언과 사용 (4/11) 3차원 포인터 변수의 역할: 2차원 포인터 변수의 주소를 저장 #include <stdio.h> int main(void) { int num=10; int* p1=NULL; int** p2=NULL; int*** p3=NULL; p1=&num; p2=&p1; p3=&p2; return 0; } &num &p1 p1 10 num &p2 p2 &p3 p3

A &cp &c1 3.3 다차원 포인터 변수의 선언과 사용 (5/11)---[3-7.c 실습] &cpp cpp cp c1 #include <stdio.h> int main( ) { char c1='A'; char* cp=NULL; char** cpp=NULL; cp=&c1; cpp=&cp; printf("%c %x %x \n", c1, cp, cpp); printf("%x %x %x \n", &c1, &cp, &cpp); printf("%c %c %c \n", c1, *cp,**cpp); return 0; }

3.3 다차원 포인터 변수의 선언과 사용 (6/11)---[3-8.c 실습] #include <stdio.h> int main( ) { int num1=10; int* ip=NULL; int** ipp=NULL; ip=&num1; ipp=&ip; printf("%d %x %x \n", num1, ip, ipp); printf("%x %x %x \n", &num1, &ip, &ipp); printf("%d %x %x \n", *&num1, *&ip, *&ipp); printf("%d %d %d \n", num1, *ip, **ipp); printf("%x %x %x \n", &num1, ip, *ipp); return 0; }

3.3 다차원 포인터 변수의 선언과 사용 (7/11)---[3-8.c 분석]

3.3 다차원 포인터 변수의 선언과 사용 (8/11)---[3-9.c 실습] int num1=10; int* ip1=NULL; int** ip2=NULL; int*** ip3=NULL; ip1=&num1; ip2=&ip1; ip3=&ip2; printf("%d %d %d %d \n", num1, *ip1, **ip2, ***ip3); printf("%x %x %x %x \n", &num1, ip1, *ip2, **ip3); printf("%x %x %x \n", &ip1, ip2, *ip3); printf("%x %x \n", &ip2, ip3); printf("%d %d \n", sizeof(int), sizeof(int*)); printf("%d %d\n", sizeof(int**), sizeof(int***)); printf("%d %d \n", sizeof(num1), sizeof(ip1)); printf("%d %d\n", sizeof(ip2), sizeof(ip3));

3.3 다차원 포인터 변수의 선언과 사용 (9/11)---[3-9.c 분석] ip3==&ip2 *ip3==ip2==&ip1 **ip3==*ip2==ip1==&num1 ***ip3==**ip2==*ip1==num1==10

3.3 다차원 포인터 변수의 선언과 사용 (10/11)---[3-10.c 실습] int num1=10; int* ip1=NULL; int** ip2=NULL; int*** ip3=NULL; ip1=&num1; ip2=&ip1; ip3=&ip2; printf("%d %d %d %d \n", num1, *ip1, **ip2, ***ip3); *ip1=20; **ip2=30; ***ip3=40;

3.3 다차원 포인터 변수의 선언과 사용 (11/11)---[3-10.c 분석]

3.4 주소의 가감산

3.4 주소의 가감산 (1/8)---[3-11.c 실습] #include <stdio.h> int main( ) { char c='A'; char* cp=NULL; char** cpp=NULL; cp=&c; cpp=&cp; printf("%x %x %x \n", &c, &cp, &cpp); printf("%x %x %x \n", &c+1, &cp+1, &cpp+1); printf("%c %x %x \n", c, cp, cpp); printf("%c %x %x \n", c+1, cp+1, cpp+1); return 0; }

3.4 주소의 가감산 (2/8)---[3-11.c 분석] printf("%x %x %x \n", &c, &cp, &cpp);

3.4 주소의 가감산 (3/8)---[3-11.c 분석] printf("%c %x %x \n", c, cp, cpp);

3.4 주소의 가감산 (4/8)---[3-12.c 실습] #include <stdio.h> int main( ) { int num=10; int* ip=NULL; int** ipp=NULL; ip=&num; ipp=&ip; printf("%x %x %x \n", &num, &ip, &ipp); printf("%x %x %x \n", &num+1, &ip+1, &ipp+1); printf("%d %x %x \n", num, ip, ipp); printf("%d %x %x \n", num+1, ip+1, ipp+1); return 0; }

3.4 주소의 가감산 (5/8)---[3-12.c 분석]

3.4 주소의 가감산 (6/8)---[3-12.c 분석]

3.4 주소의 가감산 (7/8)---[3-13.c 실습] #include <stdio.h> int main( ) { int array[3]={10,20,30}; int* ip=NULL; int** ipp=NULL; ip=array; ipp=&ip; printf("%d %d %d \n", array[0], array[1], array[2]); printf("%d %d %d \n", *(ip+0), *(ip+1), *(ip+2)); printf("%d %d %d \n", *(*ipp+0), *(*ipp+1), *(*ipp+2)); return 0; }

3.4 주소의 가감산 (8/8)---[3-13.c 분석]

3.5 함수 포인터

#include <stdio.h> int main(void) { 함수 이름은 ‘함수의 시작 주소’ #include <stdio.h> int main(void) { printf(“%x %x %x \n”, main, printf, scanf); return 0; }

3.5 함수 포인터 (2/5) 함수 포인터: 함수의 시작 주소를 저장하는 변수 자료형: 가리키는 대상이 되는 함수의 자료형을 설정 함수 포인터 이름: 괄호와 *을 반드시 사용 인수 자료형 목록: 가리키는 대상이 되는 함수의 인수들의 자료형 목록

3.5 함수 포인터 (2/5)---[3-15.c 실습] 12ff40 add pointer add() 함수의 내용 #include <stdio.h> void add(double num1, double num2); int main( ) { double x=3.1, y=5.1; void (*pointer) (double, double); // 함수 포인터 선언 printf("add 함수의 주소 : %x\n", add); printf("함수 포인터의 주소 : %x \n", &pointer); pointer=add; pointer(x, y); // 함수 포인터를 이용한 호출 return 0; } 12ff40 pointer add add() 함수의 내용 void add(double num1, double num2) { double result; result=num1+num2; printf("%lf + %lf = %lf입니다.\n", num1, num2, result); }

(double num1, double num2) 3.5 함수 포인터 (3/5)---[3-15.c 분석] void (double num1, double num2) add 포인팅 대상 함수 (double , double ) (*pointer) 함수 포인터 함수포인터에 함수 시작 주소 저장 pointer = add; 함수포인터를 이용한 함수 호출 pointer(3.1, 5.1);

3.5 함수 포인터 (4/5)---[3-16.c 실습] [3-16.c 핵심코드] int x, z; char c; void (*pointer) (int, int); scanf(“%d %c %d”, &x, &c, &z); if(c=='+') pointer=add; else if(c=='-') pointer=subtract; pointer(x,z);

3.5 함수 포인터 (5/5)---[3-16.c 분석] if(c=='+') else if(c=='-') pointer=add; pointer=subtract; &pointer pointer add subtract( ) 함수의 내용 add( ) c ==‘+’인 경우 subtract c ==‘-’인 경우 17행~18행 20행~21행

3.5 함수 포인터 (5/5)---[3-16.c 분석] 함수 포인터의 필요성 ‘일반적인 함수 호출 보다 빠른 처리 속도를 기대한다.’ 사용 분야 컴파일러, 인터프리터, 게임 프로그래밍과 같은 시스템 프로그래밍 분야

공부한 내용 떠올리기 포인터의 역할 포인터 변수의 선언과 사용 방법 포인터를 잘못 사용하는 경우 다차원 포인터 변수의 선언과 사용 방법 주소의 가감산 함수 포인터

수고 하셨습니다