int *pt = new int; //int형을 저장할 메모리를 대입
new를 이용하여 포인터를 선언한다.
delete pt; //delete로 메모리를 해제
할당되어 있는 메모리를 해제해준다.
new로 메모리를 사용한 후 반드시 delete를 사용하여 메모리를 해제해주어야 한다.
int *ps = new int;
delete ps; //O
delete ps; //X
이미 delete가 완료된 메모리는 delete를 연속해서 사용 할 수 없다.
delete는 new로 대입한 메모리를 해제할 때에만 사용해야 한다.
int *ptt = new int[10]; // 동적배열 생성
//*ptt는 배열의 첫번째원소를 가르킨다. *ptt == ptt[0]
//ptt는 배열의 첫번째원소의 주소이다. ptt == &ptt[0]
ptt[0] = 22;
cout << ptt[0];
delete [] ptt; //동적배열의 메모리제거
이렇게 대괄호를 이용하여 new를 했을 때에는 꼭 삭제할때에도 대괄호로 delete해주어야함.
널포인터에는 delete를 사용하는 것은 안전하다.
int *ptt = new int[10];
ptt[0] = 2;
ptt[1] = 5;
ptt = ptt + 1; //ptt는 처음 배열의 주소를 가르키지만 +1을 하면 그 다음 배열의 주소를 가르킨다.
cout << ptt[0];
결과값은 5가 출력이 된다.
delete[] ptt; //ptt의 주소가 +1되어있어서 오류가난다.
ptt = ptt - 1;
delete[] ptt; //ptt의 주소가 원래대로 되어서 정상적으로 delete한다.
delete할 때는 꼭 원래의 주소로 복귀한 후 delete하여야 한다.
int stacks[3] = {3,2,1};
//배열 표기
cout << stacks[0] << " " << stacks[1] << "\n"; //0번째 배열과 1번째 배열의 값
//포인터 표기
cout << *stacks << " " << *(stacks + 1) << "\n"; //0번째 배열과 1번째 배열의 값
배열을 포인터 표기로도 값을 표현할 수 있다.
int stacks[3] = {3,2,1};
int *pt = stacks;
cout << sizeof(stacks) << " "; //배열의 크기(int 형이므로 4에 개수 3만큼 곱하여 12)
cout << sizeof(pt); //포인터의 크기, int*의 크기
결과값 12 4
문자열 포인터
char cs[20] = "hihi";
char *ps;
ps = cs;
cout << "ps = cs;\n";
cout << "문자 " << cs << "\n";
cout << "문자 " << ps << "\n";
cout << "주소 " << (int *)cs << "\n"; //문자의 주소는 (int *)을 사용하여 알수있다.
cout << "주소 " << (int *)ps << "\n\n";
strcpy_s(cs, 6, "hello");
cout << "strcpy_s(cs, 6, \"hello\");\n";
cout << "문자 " << cs << "\n";
cout << "문자 " << ps << "\n";
cout << "주소 " << (int *)cs << "\n";
cout << "주소 " << (int *)ps << "\n\n";
ps = new char [strlen(cs) + 1];
strcpy_s(ps, strlen(cs) + 1, cs);
strcpy_s(cs, 6, "hihi");
cout << "ps = new char [strlen(cs) + 1];\nstrcpy_s(ps, strlen(cs) + 1, cs);\nstrcpy_s(cs, 6, \"hihi\");\n";
cout << "문자 " << cs << "\n";
cout << "문자 " << ps << "\n";
cout << "주소 " << (int *)cs << "\n";
cout << "주소 " << (int *)ps << "\n";
delete[] ps;
결과값
ps = cs; //주소를 대입하여 주소가 같다
문자 hihi
문자 hihi
주소 004FF958
주소 004FF958
strcpy_s(cs, 6, "hello"); //그래서 문자를 바꾸어도 값이 같다
문자 hello
문자 hello
주소 004FF958
주소 004FF958
ps = new char [strlen(cs) + 1]; //새로 cs의 길이+1만큼 주소를 할당한다
strcpy_s(ps, strlen(cs) + 1, cs); //cs의 내용만 가져온다
strcpy_s(cs, 6, "hihi"); //cs의 내용을 hihi로 바꾼다
문자 hihi //주소가 다르므로 내용을 바꾸어도 ps의 내용은 바뀌지 않는다.
문자 hello
주소 004FF958
주소 0059D360
'C++ > Basic' 카테고리의 다른 글
메모리 활용 예시 delete (0) | 2021.03.11 |
---|---|
구조체(struct) (0) | 2021.02.22 |
char, string (0) | 2021.02.22 |
vector, pair, tuple을 vector에 넣기 (0) | 2021.01.08 |
상수(const) (0) | 2020.11.04 |