처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 8 장 배열, 주소, 포인터.

Slides:



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

6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 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;
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;
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
5장 배열 작성자 : 변재현.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
Chapter 10 Pointer Applications.
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
23장. 구조체와 사용자 정의 자료형 2.
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
제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#.
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 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장. 변수와 타입.
C언어 프로그래밍의 이해 Ch08. 배열과 문자열.
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
5장 배열과 문자열 C 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
Chapter 08. 함수.
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
제 6 장 함수(functions).
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Chapter 09. 포인터 1.
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
Chapter 11 구조체.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
제 4 장 Record.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
어서와 C언어는 처음이지 제21장.
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 8 장 배열, 주소, 포인터

8.1 포인터로서의 배열명 배열과 포인터는 밀접한 관련이 있음 grades 배열명은 배열의 첫번째 원소의 주소와 동일함 8.1 포인터로서의 배열명 배열과 포인터는 밀접한 관련이 있음 배열명은 배열의 첫번째 원소의 주소와 동일함 예) int grades[5]; 주의할 사항 grades 배열의 각 원소는 integer로써 2 바이트를 차지함 (기계종속) 배열명 grades는 &grades[0] 와 동일하며, 포인터 상수임 grades에 1을 더하면 다음 원소의 주소가 됨 (2 바이트 증가함) &grades[3] == &grades[0] + (3*2) grades &grades[0] grades[0] grades[1] grades[2] grades[3] grades[4] *grades *(grades+1) *(grades+2) *(grades+3) *(grades+4)

8.1 포인터로서의 배열명 Program 8-1: 배열의 액세스 방법 : 2 가지 8.1 포인터로서의 배열명 배열의 액세스 방법 : 2 가지 첨자를 이용한 access : Program 8-1 포인터를 이용한 access : Program 8-2 Program 8-1: #include <stdio.h> void main(void) { int i; int grades[] = {98, 87, 92, 79, 85}; for (i=0; i<5; i++) printf(“\n Element %d is %d”, i, grades[i]); } 실행 결과 : Element 0 is 98 Element 0 is 87 Element 0 is 92 Element 0 is 79 Element 0 is 85

8.1 포인터로서의 배열명 Program 8-1: g_ptr #include <stdio.h> void main(void) { int *g_ptr;; int grades[] = {98, 87, 92, 79, 85}; g_ptr = &grades[0]; for (i=0; i<5; i++) printf(“\n Element %d is %d”, i, *(g_ptr+i) ); } g_ptr &grades[0] grades[0] grades[1] grades[2] grades[3] grades[4] *g_ptr *(g_ptr+1) *(g_ptr+2) *(g_ptr+3) *(g_ptr+4)

8.2 포인터 연산 포인터 변수 n_pt 포인터 (주소)를 값으로 가지는 변수 포인터 변수나 포인터 상수에 대하여 산술 연산이나 관계 연산을 실행할 수 있음 : 포인터 연산 포인터 연산의 결과는 의미 있는 주소가 되어야 함 (기억 장소의 의미 있는 영역을 가리켜야 함) 포인터 연산의 결과는 숫자 연산과 다름을 주의 예) int nums[100]; /* 배열 nums의 시작 주소를 18934로 가정함 */ int *npt; n_pt = &nums[0]; /* 아래 문장과 동일한 의미 */ n_pt = nums; n_pt 18934 18934 18936 18938 18940 18942 18943 nums[0] nums[1]

8.2 포인터 연산 포인터 연산과 숫자 연산의 다른점 포인터 연산의 예 : pt_num은 포인터 변수임 n_pt++는 1 증가하는 것이 아니라 다음 원소의 주소가 됨 즉, 정수가 2바이트를 차지하는 기계에서는 n_pt++는 2 (바이트) 만큼 증가함 포인터 연산의 예 : pt_num은 포인터 변수임 *pt_num++; /* (*pt_num)++ */ *++pt_num; /* *(++pt_num) */ *pt_num--; /* (*pt_num)-- */ *--pt_num; /* *(--pt_num) */

8.2 포인터 연산 포인터 연산을 사용한 프로그램의 예 : Program 8-4 #include <stdio.h> void main(void) { int nums[5] = {16,54,7,43,-5}; int i, total = 0, *n_pt; n_pt = nums; for (i=0; i<= 4; ++i) total = total + *n_pt++; printf(“The total of the array elements is %d”, total); } 결과 : The total of the array elements is 115

8.2 포인터 연산 포인터의 초기화 포인터 변수를 주소값으로 초기화할 수 있음 int miles; int *pt_num = &miles; float prices[5]; float *zing = &prices[0]; float *zing = prices; prices = &prices[3]; /* 오류 : prices는 포인터 상수임 */

8.3 배열의 전달과 사용 배열이 함수의 인자로 전달될 때 배열 자체가 전달되는 것이 아니라 배열의 주소 (첫 원소의 주소)가 전달됨 Program 8-6 : #include <stdio.h> void main(void) { int nums[5] = {2, 18, 1, 27, 16}; int find_max(int{], int); printf(“The maximum value is %d”, find_max(nums, 5)); } int find_max(int vals[], int num_els) { int i, max = vals[0]; for (i=1; i < num_els; ++i) if (max < vals[i]) max = vals[i]; return (max); nums 120 vals 2 18 1 27 16

8.3 배열의 전달과 사용 Program 8-6의 변형들 포인터 변수로 배열을 받는 경우 함수 몸체에서도 포인터를 사용하는 방법 int find_max(int *vals, int num_els) { /* 포인터 변수 vals로 배열을 전달받음 */ int i, max = vals[0]; for (i=1; i < num_els; ++i) if (max < vals[i]) max = vals[i]; return (max); } int find_max(int *vals, int num_els) { /* 포인터 변수 vals로 배열을 전달받음 */ int i, max = *vals; for (i=1; i < num_els; ++i) if (max < *(vals+i)) max = *(vals+i); return (max); }

8.3 배열의 전달과 사용 확장된 포인터 표기법 다차원 배열에 대한 포인터 접근법 차원이 높을 수록 복잡해짐 예) int nums[2][3] = {{16,18,20},{25,26,27}}; nums &nums[0] &nums[0][0] nums[0] nums[1] nums[0][0] nums[0][1] nums[0][2] nums[1][0] nums[1][1] nums[1][2] < 그림 > 배열 및 포인터 상수와 관련된 메모리 구조

8.3 배열의 전달과 사용 이차원 배열에 대한 포인터와 첨자 사용의 비교 포인터 표시법 첨자 표시법 값 포인터 표시법 첨자 표시법 값 *nums[0] nums[0][0] 16 *(nums[0] + 1) nums[0][1] 18 *(nums[0] + 2 ) nums[0][2] 20 *nums[1] nums[1][0] 25 *(nums[1] + 1) nums[1][1] 26 *(nums[1] + 2) nums[1][2] 27

8.3 배열의 전달과 사용 이차원 배열에 대한 포인터와 첨자 사용의 비교 포인터 표시법 첨자 표시법 값 포인터 표시법 첨자 표시법 값 *( *nums) nums[0][0] 16 *(*nums + 1) nums[0][1] 18 *(*nums+ 2 ) nums[0][2] 20 *(*(nums+1)) nums[1][0] 25 *(*(nums + 1)+1) nums[1][1] 26 *(*(nums + 1)+2) nums[1][2] 27

8.3 배열의 전달과 사용 *(*pt) nums[0][0] 16 *(*pt + 1) nums[0][1] 18 이차원 배열에 대한 포인터와 첨자 사용의 비교 이차원 배열 nums가 calc()로 전달되는 경우 함수 헤드는 다음과 같음 clac(pt) int pt[2][3]; 이 경우 아래와 같은 관계가 성립함 포인터 표시법 첨자 표시법 값 *(*pt) nums[0][0] 16 *(*pt + 1) nums[0][1] 18 *(*pt + 2 ) nums[0][2] 20 *(*(pt+1)) nums[1][0] 25 *(*(pt+1)+1) nums[1][1] 26 *(*(pt+1)+2) nums[1][2] 27

8.3 배열의 전달과 사용 기타 유의할 점들 포인터를 리턴하는 함수 함수에 대한 포인터 선언 함수의 선언부에 리턴될 데이터 형을 선언해야 함 예) int *calc(); /* 함수 calc()는 정수값을 가리키는 포인터를 리턴함 함수에 대한 포인터 선언 예) int (*calc)(); /* calc는 정수를 리턴하는 함수를 지시함 sum()이 정수를 리턴하는 함수라면 calc = sum은 유효함 이 경우, calc는 포인터 변수이고, sum는 함수 이름으로 포인터 상수임

8.4 자주 발생하는 에러들 존재하지 않는 배열 요소를 포인터로 참조하는 경우 예) nums가 10 개의 정수를 가지는 배열이라면 *(nums + 15)는 배열의 영역을 넘어감; 그러나 C 컴파일러는 배열 첨자의 한계를 검사하지 않으므로 컴파일시 에러가 발생하지 않음 포인터로 배열을 참조할 때 잘못된 주소의 사용과 간접 연산자를 남용하는 경우 예) 만일 pt가 포인터 변수이면 pt=&45; pt=&(miles + 10); 위 두 표현식은 값에 대한 주소를 취하려 하기 때문에 오류이다. 그러나 pt = &miles + 10; 은 유효하다. 여기서 10은 miles의 주소에 더해지게 된다. 따라서 마지막 주소가 유효한 값을 가리키게 하는 것은 프로그래머의 책임이다.

8.4 자주 발생하는 에러들 레지스터 변수의 주소를 취하는 경우 포인터 상수의 주소를 취하는 경우 예) register int total; int *pt_total; pt_total=&total; 포인터 상수의 주소를 취하는 경우 예) int nums[25]; int *pt; pt=&nums; 포인터 상수의 특성 이해 : 포인터 변수와의 차이 1. 포인터 상수의 주소는 취할 수 없다. 2. 포인터 상수에 저장된 주소는 변화시킬 수 없다.

8.5 요약 1. 배열명은 포인터 상수이고, 이 포인터 상수의 값은 배열의 첫번째 요소의 주소이다. 8.5 요약 1. 배열명은 포인터 상수이고, 이 포인터 상수의 값은 배열의 첫번째 요소의 주소이다. 2. 배열을 참조할 때 첨자에 의한 참조는 항상 포인터에 의한 참조로 바뀔 수 있다. a[i]는 *( a + i)로 바꾸어 사용될 수 있음 3. 참조에 의한 호출(call by reference)로 전달된 배열은 함수에서 직접적으로 그 배열의 요소들을 접근할 수 있다. 4. 일차원 배열이 함수의 인자로 전달될 때는, 함수의 인자 선언에서 배열이나 포인터로 선언하여 사용될 수 있다. 따라서 아래의 선언은 동일하게 된다. float a[]; float *a; 5. 포인터는 증가, 감소, 그리고 비교 될 수 있다. 포인터에 가산, 감산되어지는 값의 단위은 포인터가 가리키고 있는 변수의 자료형에 의해 자동적으로 결정된다.