Presentation is loading. Please wait.

Presentation is loading. Please wait.

C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.

Similar presentations


Presentation on theme: "C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형."— Presentation transcript:

1 C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형

2 배열 동일한 자료유형의 여러 변수를 일괄 선언 연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조
동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조 배열의 선언에는 자료유형, 변수이름, 그리고 배열의 크기가 필요

3 배열의 크기와 첨자 첨자 배열 원소는 첨자(index)를 사용하여 참조
배열의 첫 원소는 항상 첨자가 0이며, 차례로 1씩 증가 배열 첨자는 유효한 값의 범위를 벗어나는 경우 문제가 발생하므로 항상 배열 첨자의 사용에 주의: 첨자 범위 : 0 ~ size-1

4 배열의 초기화 배열의 초기화에서 배열 의 크기 생략 가능

5 C-문자열 처리와 저장 C-문자열은 널(null) 문자(\0)가 문자 배열의 마지막에 저장
문자열은 일련의 문자를 앞 뒤로 인용부호로 둘러싸서 표기 항상 널 문자가 문자열의 마지막에 있어야 함. 만일 \0 문자가 없으면 그냥 문자배열(character array)로 취급. 따라서 문자열을 저장하는 배열의 크기는 저장되는 문자의 개수 보다 1이 커야 함

6 문자열 출력 문자열이 저장된 배열 이름을 이용하여 printf()문을 이용
배열 이름이 문자열 자체를 나타낸다고 생각 문자열을 출력하는 또 다른 방법은 다음과 같이 문자열을 구성하는 각각의 문자를 출력하는 방법 출력의 제한을 널(\0) 문자로 검사하면 편리 char str[] = “C Language!”; printf(“%s”, str);

7 함수의 인자로서의 배열 함수 호출(call) 문장 함수 sum()은 지역변수 total에 모든 원소의 합을 구하여 반환
첫 번째 인자는 배열 이름인 grade, 두 번째 인자는 이 배열의 크기인 7 int sum(int arr[], int n) { int i = 0, total = 0; for (i = 0; i < n; i++) total += arr[i]; return total; } printf("함수에서 구한 합은 %d이다. \n", sum(grade, 7));

8 지역변수와 전역 변수 변수의 유효 범위에 따른 구분
프로그램에서 사용되는 변수의 유효한 사용범위를 변수의 범위(scope)라고 함 지역 (local) 변수는 함수 또는 하나의 블록에서 선언되고 사용되는 변수 함수 외부에서 선언되는 함수를 전역 (global) 변수

9 키워드 extern 키워드 extern이 반드시 필요한 경우는 언제인가?
전역 변수 gCount가 선언된 위치가 이 변수를 사용하려는 블록이나 함수의 위치보다 나중에 위치하면, 블록이나 함수 내부에서 이 변수를 사용하기 위해서는 반드시 키워드 extern을 이용하여 외부 변수임을 알려야 함 파일 자체가 다른 경우에도 다른 파일에서 선언된 전역 변수를 이용하기 위해서는 extern에 의한 외부 변수임을 선언해야 함

10 정적 변수 변수의 선언에서 자료 유형 앞에 키워드 static을 넣어 정적 변수를 선언
정적 변수는 지역변수와 전역변수 모두에 이용 가능 정적 변수는 정적 지역변수와 정적 전역변수로 나눌 수 있음

11 메모리 주소 Address(주소) 메모리에는 저장장소의 위치를 나타내는 주소 값이 있음

12 주소 연산자 &변수 변수의 주소 값을 알아내려면 그 변수 앞에 주소 연산자 & (ampersand)를 이용 주소 값 이용의 장단점 주소 값을 이용하면 보다 편리하고 융통성 있는 프로그램이 가능 그러나 포인터를 사용한 프로그램 제작은 어려움

13 포인터 변수 포인터 변수는 일반 변수와는 다르게 변수에 저장되는 값이 메모리의 주소(address) 값만을 저장할 수 있는 특별한 변수

14 포인터 변수 선언 포인터 변수의 선언 여러 개의 포인터 변수를 한 번에 선언
포인터 변수는 그 포인터가 가리키는 변수의 자료유형에 따라 다름 일반 변수가 아니고 포인터 변수라는 사실을 나타내는 기호 * 별표 *의 위치가 변수 자료형 int와 변수명 사이 어디에 위치하든 관계 없음 여러 개의 포인터 변수를 한 번에 선언 int* ptr1, ptr2, ptr3; int *ptr1, *ptr2, *ptr3;

15 역참조 연산자 역참조(dereference) 연산자 * 구문 *ptr = i + 2;을 이용
포인터 변수 앞에 역참조 연산자 *를 붙이면 그 포인터가 가리키는 변수를 지칭 (포인터들 사이의 곱하기는 없음) 구문 *ptr = i + 2;을 이용 변수 i의 값이 2 증가

16 NULL 포인터 포인터 변수에 저장하는 NULL 포인터 변수를 선언할 때 다음과 같은 문장을 자주 이용한다.
포인터 변수가 다른 변수를 가리키는 지를 검사하는데 이용 int *ptr = NULL #define NULL ((void *)0) if (ptr == NULL) { }

17 배열과 포인터 포인터를 이용하여 배열의 각 원소를 참조하는 방법 그렇다면 point는 무엇으로 이용할 수 있을까?
다음과 같은 배열 선언에서 변수 point[]는 int 형 원소 6개를 저장할 수 있는 배열을 의미 그렇다면 point는 무엇으로 이용할 수 있을까? 위에서 point는 배열의 첫 원소인 point[0]의 주소 point는 주소 상수로 배열의 첫 번째 원소의 주소 값 주소 상수 point에 역참조 연산자 *를 이용하면 바로 변수 point[0]를 지칭하므로 다음이 성립 int point[] = {95, 88, 76, 54, 85, 82}; point == &point[0] *point == point[0]

18 배열 이름을 이용한 원소 참조 배열이름을 이용한 point + 1(주소상수 + 1)은 무엇일까?
즉 point + 1은 &point[1]을 의미 배열 이름인 point와 역참조 연산자 *를 이용한 식 *point == point[0] *(point + 1) == point[1] *(point + 2) == point[2] *(point + i) == point[i]

19 함수의 인자로 포인터 이용 포인터 인자 함수의 형식 인자에서 int arr[] 와 int *arr 는 같은 의미
아래의 for문에서 다음 두 개의 코드는 같은 의미 sum += arr[i] sum += *(arr + i) int sumArray(int *arr, int SIZE) { int sum = 0, i = 0; for (i = 0; i < SIZE; i++) sum += *(arr + i); return sum; }

20 값에 의한 호출 call by value 함수의 형식 인자가 기본 자료형일 때 실제 함수가 호출되는 경우, 실인자의 값을 형식인자에 할당된 새로운 변수에 복사 저장 호출 전에는 변수 number에 10이 저장되었고, 변수 number를 실인자로 함수 increment(number)를 호출 함수 호출 후 변수 number의 값은 변했을까?

21 주소에 의한 전달의 이해 call by address

22 구조체 struct 구조체 정의 서로 다른 자료형들을 묶어서 만든 새로운 자료형 중괄호 사이에 원하는 여러 개의 변수를 선언
중괄호 다음 마지막에 세미콜론(;)을 반드시 기술

23 구조체 정의와 변수 선언 구조체 정의는 새로운 자료형을 정의하는 구문 변수 선언 구조체 정의 구문 후에 구조체 변수 선언

24 초기 값 지정 구조체 변수 mybook에 초기 값을 대입 멤버 참조
구조체 변수도 배열과 같이 중괄호를 이용하여 초기 값을 대입 가능 멤버 참조 구조체 멤버의 값을 알려면 멤버 접근 연산자인 마침표(.)를 이용 struct book mybook = “홍길동", …, 20000}; 구조체변수이름.멤버이름 mybook.author

25 구조체 포인터 구조체 변수의 주소 값을 저장하는 구조체 포인터 변수
변수 ku는 구조체 변수이고, 변수 ptr은 구조체를 가리키는 포인터 struct univ { char title[50]; // 이름 char address[50]; // 주소 int students; // 학생수 }; struct univ ku = {"한국대학교", "서울시 서초구", 5000}; struct univ *ptr = &ku; int num = ptr->students; // 구조체 포인터의 멤버 접근 연산자 ‘->’


Download ppt "C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형."

Similar presentations


Ads by Google