Pointers summary.

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
1 구조체 윤 홍 란 컴퓨터 프로그래밍 2 구조체 정의  구조체란 ? o 서로 다른 형의 변수들을 하나로 묶어주는 mechanism. (cf. 배열 : 같은 형의 변수들을 하나로 묶어주는 mechanism) o 예 : 카드의.
포인터란? 사전적 의미로써 지시자 혹은 가리키는 것으로 풀이할 수 있으나, C프로그래밍 언어에서는 메모리의 주소를 저장하는 변수이다. 포인터 자체가 하나의 변수이기 때문에 포인터도 메모리 내에서 선언이 되며 일반 상수를 저장하는 변수가 아닌 주소값을 저장하는 변수라는 점에서.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
Chapter 14 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제 9 장 구조체와 공용체.
-Part2- 제3장 포인터란 무엇인가.
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
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. 포인터의 이해.
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
임베디드 실습 # LED, 7’Segment 제어
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
* 07/16/96 처음으로 배우는 C 프로그래밍 제1부 기초 제3장 치환, 주소, 대화식 입력 *
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 8 장 배열, 주소, 포인터.
C#.
13. 연산자 오버로딩.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
제 1 강.
8주차: Strings, Arrays and Pointers
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
Canary value 스택 가드(Stack Guard).
제 6 장 함수(functions).
데이터 동적 할당 Collection class.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Chapter 09. 포인터 1.
7주차: Functions and Arrays
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
Chapter 11 구조체.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
어서와 C언어는 처음이지 제21장.
13. 포인터와 배열! 함께 이해하기.
7 생성자 함수.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

Pointers summary

요약

순서 Binary to Byte 주소 변수의 주소 확인 Scanf에서 & 연산자의 활용 포인터의 2개의 연산자 포인터 변수와 사용 예 활동: 인간 포인터 연습 void 타입과 변수 크기와의 관계 포인터에서의 캐스팅 포인터와 배열

Binary to Byte 8 bit = 1 byte 1203 = 1024 + 128 + 32 + 16 + 2 + 1 1203의 2진수 표현 1203 = 1024 + 128 + 32 + 16 + 2 + 1 = 210 + 27 + 25 + 24 + 21 + 20 2진수 => 0100 1011 0011 16진수 => 4 B 3 Binary(2진수)는 각 자리 또는 bit에 0과 1만 표현 가능 1203을 2진수로 표현하기 위해 11bit가 필요함 8 bit = 1 byte 위치 10 9 8 7 6 5 4 3 2 1 값

주소 32bit 주소 체계를 따르는 컴퓨터의 경우 정보의 표현 64bit인 경우 한 줄에 64개 2진수 표현 가능 1word 1byte 1word offset 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 주소 0byte 4byte 8byte 12byte 16byte

주소 모든 객체 (변수, 함수 등)은 고유의 주소를 갖음 예시 int a = 100; int b = 200; int c = 300; …0 31… 100 104 108 112 116 120 124 128 132 136

주소 모든 객체 (변수, 함수 등)은 고유의 주소를 갖음 예시 int a = 100; int b = 200; int c = 300; …0 31… 100 104 108 112 116 120 124 128 132 136 1 변수 할당 a

주소 모든 객체 (변수, 함수 등)은 고유의 주소를 갖음 예시 int a = 100; int b = 200; int c = 300; …0 31… 100 104 108 112 116 120 124 128 132 136 2 값 초기화 1 변수 할당 100 a

주소 모든 객체 (변수, 함수 등)은 고유의 주소를 갖음 예시 int a = 100; int b = 200; int c = 300; …0 31… 100 104 108 112 116 120 124 128 132 136 2 값 초기화 1 변수 할당 100 a 5 6 300 c 200 b 4 3 할당 위치는 운영체제가 정함

문제 다음의 메모리 상태를 참고로, 변수 초기화 문장을 작성 392 …0 31… 100 104 235 108 112 116 ABC\0 120 124 128 8.0 132 136 c int a = 235; float c = 8.0; int b = 392; char d[] = “ABC”; a d b

문제 다음의 메모리 초기화 문장을 토대로 메모리 배치도 작성 1 …0 31… 100 104 39.2 108 112 116 400201 120 124 128 132 136 a int a = 1; float b = 39.2; double c = 400201; char d[5] = { 1, 2, 3, 4, 5}; b c 132 1 133 2 134 3 b 135 4 136 5

변수의 주소 확인 #include <stdio.h> int main(){ int c[5] = { 3, 2, [3] = 8, [4] = 9}; for (int k = 0; k < 5; k++) printf("value of c[%d] = %d; address is %p\n", \ k, c[k], &c[k]); return 0; } 16진수 주소 형식 주소 연산자: 변수의 저장된 주소 변수 c 할당 변수 c 초기화 변수 k 할당 변수 k 초기화 c[k]의 값과 주소 출력 변수 k의 값 증가

변수의 주소 확인 value of c[0] = 3; address is 0x7fff5602a3e0 실행 결과 value of c[0] = 3; address is 0x7fff5602a3e0 value of c[1] = 2; address is 0x7fff5602a3e4 value of c[2] = 0; address is 0x7fff5602a3e8 value of c[3] = 8; address is 0x7fff5602a3ec value of c[4] = 9; address is 0x7fff5602a3f0 …0 31… 3 0x7fff5602a3e0 2 0x7fff5602a3e4 0x7fff5602a3e8 8 0x7fff5602a3ec 9 0x7fff5602a3f0 0x7fff541c13d8 …

Scanf에서 &연산자의 활용 3.14 1 float a; // 4byte 2 scanf(“%f”, &a); 2 사용자 입력 ⏎ …0 31… 300 304 308 312 316 320 324 328 332 336 4 3.14 저장 1 변수 할당 3.14 a 3 a의 주소 확인 주소: 308

역참조 연산자(dereference operator) 포인터의 2개의 연산자 & 포인터 변수 저장하는 것은 주소 * 참조 연산자(reference operator) 역참조 연산자(dereference operator) “~가 가리키는 값” 으로 이해 “~의 주소”로 이해 *Dereference는 역참조 또는 간접참조라 부름

double *pointer_variable; 포인터 변수 선언 – 역참조 연산자를 사용하여 주소를 저장하는 변수임을 표시 할당 – 참조 연산자를 사용하여 주소를 포인터 변수에 저장 읽기 – 역참조 연산자를 사용하여 저장된 주소가 가리키는 곳의 값을 가져옴 역참조 연산자 타입 포인터 변수명 double *pointer_variable; 참조 연산자 포인터 변수 변수명 pointer_variable = &variable; 역참조 연산자 포인터 변수명 *pointer_variable;

포인터 변수의 사용 예 다른 변수의 주소를 포인터 변수에 저장하는 방법 Type I – 포인터 변수 선언시 주소 할당 Type II – 일반적인 주소 할당 방법 1 int a = 100; // a 의 주소는 256이라 가정 int *pa = &a; // 포인터 변수 선언 및 주소 할당 1 int a = 100; // a 의 주소는 256이라 가정 int *pa; // 포인터 변수 선언 … // 다른 문장들 실행 pa = &a; // 포인터 변수에 a의 주소 저장

포인터 변수의 사용 예 1 int a = 100; // a 의 주소는 256이라 가정 int *pa; // 포인터 변수 선언 … // 다른 문장들 실행 pa = &a; // 포인터 변수에 a의 주소 저장 1 …0 31… 300 100 304 308 312 316 320 324 328 …0 31… 300 100 304 308 312 316 320 324 328 2 …0 31… 300 100 304 308 312 &a = 304 316 320 324 328 3 a a a pa pa

예시 int a = 100, b = 200, c = 300; int *pv; printf(“%p\n”, pv = &a); printf(“%p\n”, pv = &b); printf(“%p\n”, pv = &c); …0 31… 100 104 108 112 116 120 124 128 132 1 pv 값은 a의 주소 104 pv 100 a 2 pv 값은 b의 주소 120 300 c 3 pv 값은 c의 주소 112 200 b

예시 int a; int *pv = &a, *pu = &a); printf(“%d\n”, *pu = 400); printf(“%d, %d\n”, a, *pv); // pv와 pv는 a의 주소 104를 저장 …0 31… 100 104 108 112 116 120 124 128 132 1 pu가 가리키는 a에 400 저장 pv 100 a 2 pv가 가리키는 a의 값 400 읽음 3 pv 값은 c의 주소 112 pu

활동: 인간 포인터 연습 3 1 2 전체 인원을 반으로 나누어 2 팀으로 나눔 제비뽑기를 통해 모든 사람은 두 개의 숫자를 갖음 그 중 한 숫자는 주소 다른 한 숫자는 값임 주소는 1에서 부터 40까지, 값도 1에서 부터 40까지임 주소와 값이 동일한 수이면 왼쪽 사람의 값과 교환 1번 주소부터 40번 주소까지 모두 순회하는 데 걸리는 시간을 비교 함 1번 주소의 사람은 자신의 값을 활용하여 역참조(*연산)를 하여 값을 찾아 부름 역참조된 값을 갖고 있는 주소로 반복 예시: 3 1 2 1 3 2

9 5 7 3 8 2 6 포인터 연습 문제 8 1 4 X 값 int a; // a의 값은 0, 주소는 8 int *p = &a; // p의 주소는 8 printf(“%p “, *p); // 0를 출력함 printf(“%p “, *******p); // 1을 출력함 printf(“%p “, ****p); // 4를 출력함 문제: 값 주소 다음과 같이 각 주소와 값이 설정되어 있다고 할 때, 포인터만을 써서 자신의 번호의 뒷자리를 출력하도록 해보자. 포인터 변수 p 9 5 7 3 8 2 6 1 4 8 X

포인터 연습 문제 int a; // a의 주소는 1 int *p = &a; // p의 주소는 20 *p = 12; 문제: 값 주소 12 3 4 11 14 20 17 15 10 19 18 9 1 2 5 6 7 8 16 13 **p==5 &*p *******p=4 &*&***p==12 **p == 5 is wrong, should be **p == 12 &*p is address and should be 20 Address 14 ‘s value 16 is changed to 4 &*&***p == 12 correct 포인터 변수 p 20 X

void는 타입 미지정 필요에 따라 void 타입 변수를 다른 타입으로 캐스팅(casting)하여 사용 캐스팅 방법 void는 타입 미지정 필요에 따라 void 타입 변수를 다른 타입으로 캐스팅(casting)하여 사용 (새로운 타입) 변수명 float a = 3.9, b = 7.2 int sum; sum = (int)b % (int)a; float형 변수 a와 b를 int형으로 캐스팅 int형 변수 sum에 결과를 저장

포인터에서의 캐스팅 int a = 100; double b = 300; int c[2] = {1, 2}; …0 31… 500 504 508 512 516 520 524 528 532 536 540 544 548 100 a 300 b int *pa = &a; double *pb = &b; 1 c[0] int *pc = &c[0]; 2 c[1] 500 pa void *k; k = &a; 504 pb 512 pc 1 k 값은 a의 주소 500 500 k

포인터에서의 캐스팅 int a = 100; double b = 300; int c[2] = {1, 2}; …0 31… 500 504 508 512 516 520 524 528 532 536 540 544 548 100 a 300 b int *pa = &a; double *pb = &b; 1 c[0] int *pc = &c[0]; 2 c[1] 500 pa void *k; k = &a; printf(“%d\n”, *(int*)k); 504 pb 512 pc 1 k 값은 a의 주소 500 500 k 2 읽을 바이트의 길이는 int 타입의 길이 4바이트

포인터에서의 캐스팅 int a = 100; double b = 300; int c[2] = {1, 2}; …0 31… 500 504 508 512 516 520 524 528 532 536 540 544 548 100 a 300 b int *pa = &a; double *pb = &b; 1 c[0] int *pc = &c[0]; 2 c[1] 500 pa void *k; k = &a; printf(“%d\n”, *(int*)k); k = &b; printf(“%d\n”, *(double*)k); 504 pb 512 pc 504 k

포인터에서의 캐스팅 int a = 100; double b = 300; int c[2] = {1, 2}; …0 31… 500 504 508 512 516 520 524 528 532 536 540 544 548 100 a 300 b int *pa = &a; double *pb = &b; 1 c[0] int *pc = &c[0]; 2 c[1] 500 pa void *k; k = &a; printf(“%d\n”, *(int*)k); k = &b; printf(“%d\n”, *(double*)k); k = &c[0]; printf(“%d\n”, *(int*)k); 504 pb 512 pc 512 k

포인터와 배열 int c[4] = {1, 2, 3, 4}; int *pc; …0 31… 500 504 508 512 516 520 524 528 532 536 540 544 548 포인터를 이용한 배열 접근 pc = &c[0]; // c[0]의 주소 pc = &c[1]; // c[1]의 주소 pc = &c[2]; // c[2]의 주소 pc = &c[3]; // c[3]의 주소 1 c[0] 2 c[1] 3 c[2] 4 c[3] 포인터 연산을 이용한 배열 접근 pc; // c[0]의 주소 pc+1; // c[1]의 주소 pc+2; // c[2]의 주소 pc+3; // c[3]의 주소 512 pc 시작 주소+(변수의 타입)*배열인덱스 c[2]의 주소 = 512 + 4*2 = 520