4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기

Slides:



Advertisements
Similar presentations
3. 자료형. 담당교수 : 이 성 우 C++ 프로그래밍 상수와 변수 (3) 1. 변수 (variable)  프로그램 수행 도중에 자료  변수를 위해 은 변하지 않음  선언 시에 반드시 그. ※ 저장 정보의 구성 ① 정보의 종류 ② 저장 값 ③ 저장 위치 int Num.
Advertisements

Vision System Lab, Sang-Hun Han
명품 C++ 프로그래밍 3장. 클래스와 객체.
명품 C++ 8장 상속.
명품 C++ 4장. 객체 포인터와 객체 배열, 객체의 동적 생성.
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제1장 기초 사항.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C++ Espresso 제2장 제어문과 함수.
강좌명 : C++프로그래밍 (C++ Programming)
제 2 장 배열과 스트링.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
C++ Exspresso 제5장 클래스의 기초.
8. 객체와 클래스 (기본).
명품 JAVA Essential.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
C++ Espresso 제9장 다형성.
10장 템플릿과 표준 템플릿 라이브러리(STL)
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
C++ Espresso 제6장 생성자와 소멸자.
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
명품 Java Programming.
7장 클래스.
명품 C++ 7장 프렌드와 연산자 중복.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
21장. 문자와 문자열 처리 함수.
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
C ++ 프로그래밍 시작.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
Chapter 1 C++ 기초 Copyright © 2010 Pearson Addison-Wesley. All rights reserved.
C++ Programming: chapter 7 – inheritence
프로그래밍2 및 실습 C언어 기반의 C++ 2.
스택(Stack) 김진수
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제 5 장 근 궤적 법.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
타입, 연산자 Chapter 5, 6 Kum Deuk Kyu , Ph. D. Spring 2015
가상함수와 추상 클래스.
Chapter 1 C와는 다른 C++. 최호성.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
Chapter 12. String 클래스의 디자인
루프와 카운트 Looping and counting
멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
C-언어와 기반구조 정보보호학과 이정수 교수.
5. 논리적 자료표현 : 구조체.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
C++ Espresso 제13장 입출력과 파일처리.
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
컴퓨터 프로그램은 여러 기능의 복합체이다. 라이브러리 함수와 사용자 정의 함수
10장 템플릿과 표준 템플릿 라이브러리(STL)
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
17장. 포인터의 포인터.
C.
Presentation transcript:

4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기

차 례 포인터 변수 배열 문자열 포인터 : 메모리 주소 레퍼런스 변수 동적 할당

포인터 컴퓨터는 처리하는 모든 데이터를 주기억장치에 저장한다. 포인터 : 주기억장치의 주소 포인터 변수 : 주소를 저장 일반 변수 : 값을 저장 ….. 값 주소 0012FF60 300 …...

포인터 변수 1 변수 저장장소 변수는 사용하기 전에 미리 선언해야 한다. 변수는 사용하기 전에 초기화 되어야 한다. 초기화하지 않은 경우 쓰레기 값이 저장되어 있다. 값을 저장하려면 일반 변수로 선언되어야 함!! 주소를 저장하려면 포인터 변수로 선언되어야 함!!

소스 4-2 (ch04_01_1.cpp) #include <iostream> using namespace std; int main() { int sum=0, i=0; for (i=1; i<=10; i++) sum=sum+i; cout << "1~10까지의 합 : " << sum << endl; return 0; } 중단점 찍고 단계별로 실행하면서 sum 변수의 주소, 변수 값 확인해보기

포인터 변수 2 변수 값 참조 – 일반변수 이름 사용 변수의 주소 확인(주소지정 연산자 & 사용) int a=100;; 소스 4-2 (ch04_01_1.cpp) int a=100;; cout << "a에 저장된 값 : " << a << endl; cout << "a의 주소 : " << &a << endl; return 0; 실행 결과 a에 저장된 값 : 100 a의 주소 : 0012FF60

포인터 변수 3 포인터 변수 일반변수와 마찬가지로 사용 전 선언해야 함 변수의 주소를 저장 포인터 변수에 저장할 주소에 저장될 자료형과 포인터 변수의 자료형은 일치해야 함 (정수형 포인터 변수는 정수형 변수의 주소, 문자형 포인터 변수는 문자형 변수의 주소를 저장함) 일반변수와 마찬가지로 사용 전 선언해야 함 자료형 일반변수이름; 자료형 *포인터변수이름;

일반변수와 포인터 변수 일반변수 : 값을 저장해야 할 경우 필요 포인터변수 : 변수의 주소를 저장해야 할 경우 (동적 할당 또는 6장 함수에서 다뤄짐) 일반변수 포인터 변수 비고 선언 자료형 변수이름; 자료형 *포변수이름; & : 주소지정 연산자 * : 간접 연산자 값 할당 변수이름=값; 포변수이름=주소; *포변수이름=값; 선언과 동시에 초기화 자료형 변수이름=값; 자료형 *포변수이름=주소; ‘포인터변수이름’을 ‘포변수이름’으로 표기함

소스 4-4 (ch04_03.cpp) #include <iostream> using namespace std; int main() { int a=100;; int *pa; pa=&a; cout << "a에 저장된 값 : " << a << endl; cout << "a의 주소 : " << &a << endl; cout <<"******************************"<< endl; cout << "a에 저장된 값 : " << *pa << endl; cout << "a의 주소 : " << pa << endl; return 0; }

배열 1 변수 배열 하나의 기억 공간 예) 나이, 점수, 성별 등의 데이터를 저장 연속적인 기억 공간 예) 30명의 총점을 저장, 세 과목의 성적을 저장 선언할 때 연속적으로 필요한 기억 공간의 개수를 표시

배열 2 배열 선언 : 자료형, 배열이름, 크기 배열 첨자는 0부터 시작 int score[3]; 의 경우 score[0], score[1], score[2] char name[30];의 경우 name[0], name[1], …. , name[28], name[29] 자료형 배열이름[크기];

배열 3 배열이름 = 주소 int score[3]; &score[0] == score &score[1] == score+1 char name[5]; &name[0] == name &name[1] == name+1 &name[2] == name+2 &name[3] == name+3 &name[4] == name+4 정수형 배열의 경우 각 기억장소가 4바이트 단위로 증가함 문자형 배열의 경우 각 기억장소가 1바이트 단위로 증가함

소스 4-8 (ch04_05.cpp) int score[3]={99,88,100}; cout << "score[0]의 주소 : " << &score[0] << endl; cout << "score[1]의 주소 : " << &score[1] << endl; cout << "score[2]의 주소 : " << &score[2] << endl; cout << "******************************************" << endl; for (int i=0; i<3; i++) cout << "score[" << i << "]의 주소 : " << &score[i] << endl; cout << "score[0]의 주소 : " << score << endl; cout << "score[1]의 주소 : " << score+1 << endl; cout << "score[2]의 주소 : " << score+2 << endl; cout << "score[" << i << "]의 주소 : " << score+i << endl;

배열 초기화 선언과 동시에 초기화 자료형 배열이름[크기]={초기값1, 초기값2, ….}; 자료형 배열이름[크기]={초기값1, 초기값2, ….}; 자료형 배열이름[크기]={초기값, }; int s[3]={10,20, 30}; int a[5]={0,};

문자열 문자열 : 문자의 모음 문자 배열 문자열 상수는 쌍따옴표 “”로 표기 문자열 마지막을 알리는 널(NULL)문자가 자동으로 입력됨 char string[30]=“computer”; char string[30]={‘c’, ‘o’, ‘m’, ‘p’, ‘u’, ‘t’, ‘e’, ‘r’, ‘\0’};

소스 4-11 (ch04_10.cpp) #include <iostream> using namespace std; int main() { char string[30]="computer"; int i=0; cout << string << endl; for (i=0; string[i]!='\0'; i++) cout << string[i]; cout << endl; return 0; }

문자열 함수 1 자주 사용하는 문자열 처리 함수를 라이브러리에서 제공함 문자열 길이 구하기 문자열 복사하기 strlen(const char *_Str) 문자열 복사하기 strcpy(char *_Dest, const char *_Str) strcpy_s(char *_Dest, rsize_t SizelnBytes, const char *_Str)

문자열 함수 2 문자열 결합하기 문자열 비교하기 strcat(char *_Dest, const char *_Str) strcat_s(char *_Dest, rsize_t Sizeln Bytes, const char *_Str) 문자열 비교하기 strcmp(const char *str1, const char *str2)

소스 4-18 (ch04_14.cpp) char s_string[100]="C++ programming is very interesting!!!"; char d_string[100]; cout << "s_string = " << s_string << endl; strcpy_s(d_string, _countof(d_string), s_string); //s_string를 d_string에 복사하기 cout << "d_string = " << d_string << endl; strncpy_s(d_string, _countof(d_string), s_string, 3); //s_string에서 3개의 문자를 d_string에 복사하기 strcat_s(d_string, _countof(d_string), "*****"); strncat_s(d_string, _countof(d_string), s_string, 3);

주민등록번호 입력 받아 생년월일 출력 실행 결과 : 주민등록번호 입력: 000000-0000000 당신은 0000년 00월 00일에 태어나셨습니다. 필요한 변수 : 주민등록번호를 저장할 문자 배열 생년월일에서 연도를 저장할 문자 배열 생년월일에서 월을 저장할 문자 배열 생년월일에서 일을 저장할 문자 배열 작업 순서를 정리하면 다음과 같다. 필요한 변수를 선언한다. 주민등록번호 입력 메시지를 출력한다. 주민등록번호 문자열을 입력받는다. 첨자 7의 문자가 1, 2 또는 3, 4인가를 확인해서 연도 배열 변수에 '19' 또는 '20'을 할당한다. 주민등록번호에서 연도에 해당하는 문자열을 연도 배열 변수에 덧붙인다. 주민등록번호에서 월에 해당하는 문자열을 월 저장 배열 변수에 할당한다. 주민등록번호에서 일에 해당하는 문자열을 일 저장 배열 변수에 할당한다.

소스 4-19 (ch04_15.cpp) char jumin[30]={0,}; char year[5]={0,}, month[3]={0,}, day[3]={0,}; cout << "주민번호 입력 : "; cin >> jumin; if (jumin[7]=='1' || jumin[7]=='2') strcpy_s(year, _countof(year), "19"); else strcpy_s(year, _countof(year), "20"); strncat_s(year, _countof(year), jumin, 2); strncpy_s(month, _countof(month), jumin+2, 2); strncpy_s(day, _countof(day), jumin+4, 2); cout << "당신은 " << year << "년 " << month << "월 " << day << "일 입니다." << endl;

포인터 : 메모리 주소 포인터의 크기 주기억장치에서의 자료 처리 기본 단위 운영체제에 의해 결정, 윈도우 XP(32비트 운영체제) int *pi; char *pc; float *pf; double *pd; cout << "정수형 포인터 크기 : " << sizeof(pi) << endl; cout << "문자형 포인터 크기 : " << sizeof(pc) << endl; cout << "실수형 포인터 크기 : " << sizeof(pf) << endl; cout << "배정도형 포인터 크기 : " << sizeof(pd) << endl;

레퍼런스 변수 이미 선언한 변수를 다른 이름을 부르는 것 레퍼런스 변수 선언시 반드시 초기화 해야 함! 자료형 &변수이름=변수;

소스 4-22 (ch04_18.cpp) #include <iostream> using namespace std; int main() { int a=100; int &ra=a; cout << "a= " << a << endl; cout << "ra=" << ra << endl; cout << "****************" << endl; ra=200; return 0; }

동적 할당 1 자료 저장을 위한 기억장소 할당 방법 정적 할당 동적 할당 프로그램에서 필요한 변수를 선언 프로그램 실행 시작에서 필요한 변수에 대한 기억공간이 할당됨 동적 할당 프로그램에서 필요한 기억공간의 크기를 할당하여 그 시작 주소를 기억 (포인터변수 사용!!) 프로그램 실행 중 기억공간이 할당되고, 사용을 마친 후 할당한 기억공간을 해제

동적 할당 2 기억장소 할당 : new 기억장소 해제 : delete 자료형 *포인터변수 = new 자료형[개수]; double *dp = new double; //한 개의 배정도형 기억공간 할당 delete dp; int *ip=new int[20]; delete [] ip;

소스 4-23 (ch04_19.cpp) int *pi = new int; *pi=100; cout << *pi << endl; delete pi; int *pj = new int[3]; int i; pj[0]=10; pj[1]=20; pj[2]=30; for (i=0; i<3; i++) cout << pj[i] << endl; delete [] pj;