안녕하세요 넬다이 입니다.
이번 시간에는 C와 C++의 꽃 포인터 시간입니다.
많은 분들이 포인터에서 포기를 하시는걸 많이 봐왔어요.
하지만 너무 포인터를 어렵게만 생각하지 말아 주시고 아 이런 거구나라고 이해를 하시기만 하고
사용을 직접 다양하게 하면서 깨달아 가면 충분히 다들 가능할 거라고 생각합니다.
포인터
우리가 변수를 선언하게 되면 메모리 어딘가에 해당 자료형의 크기만큼 공간이 할당된다.
그리고 그 공간은 주소를 통해 식별할 수 있다.
메모리의 주소를 저장하기 위한 변수가 포인터 변수이다.
잘 사용한다면 정말 편리하지만... 잘못 사용할 경우에는 치명적인 문제를 초래할 수 있다.
어떤 변수가 메모리를 점유하고 있든 간에 그 공간에 접근하여 값을 변경할 수 있기 때문이다.
고급 언어인 JAVA 나 C# 은 포인터를 사용하지 않는다.
일반 변수는 값을 저장하지만 포인터는 주소 값을 저장한다.
변수 앞에 &을 붙여주면 그 변수의 주소가 나오는 것이다.
주소 값은 8자리로 이루어져 있으며 하나당 16진수 하나의 값이다.
비트로 치면 4개의 비트 값을 표현한다.
주소 한 개를 저장하기 위한 최소 크기는 1바이트이다.
int iA = 10;
cout << iA << endl;
cout << &iA << endl;
//포인터 변수 NULL 로 초기화
int* pA = NULL;
//포인터 변수 pA
pA = &iA;
cout << "pa의 값."<< pA << endl;
cout << "pa가 가리키고 있는 공간의 값."<< *pA << endl;
다들 이 코드를 실행해보시면은
pA의 값과 가리키는 공간의 값이 다르다는 걸 알 수 있을 거예요
pA는 포인터 변수이고 포인터 변수는 주소를 담을 수 있는 변수예요
가리키는 공간의 값은 pA는 iA를 카르키고 있고 그 안에 값은 10이기 때문이에요
int iA = 10;
cout << iA << endl;
cout << &iA << endl;
//포인터 변수 NULL 로 초기화
int* pA = NULL;
//포인터 변수 pA
pA = &iA;
cout << "pa의 값."<< pA << endl;
cout << "pa가 가리키고 있는 공간의 값."<< *pA << endl;
//포인터변수가 가리키는 공간의 값을 변경할 수 있다.
*pA = 20;
cout << iA << endl;
위에 코드에서 좀 더 더해서 정리하자면은
포인터 변수 앞에 *을 붙이면 포인터가 가리키고 있는 공간의 값을 말한다.
포인터 변수가 가리키는 공간의 값을 변경할 수 있다.
cout << sizeof(bool*) << endl;
cout << sizeof(char*) << endl;
cout << sizeof(short*) << endl;
cout << sizeof(int*) << endl;
cout << sizeof(float*) << endl;
cout << sizeof(double*) << endl;
32비트 운영체제에서 포인터 변수는 반드시 4바이트다.
메모리 주소 값을 32비트로 표현하기 때문이다.
즉 4바이트의 메모리 용량을 갖는다.
1바이트는 8비트..
위에 있는 sizeof(자료형*)에서 자료형이 어떤 자료형이든 포인터 변수이기 때문에 전부 4byte로 출력된다.
일반 변수에는 값이 들어가는 것이고
포인터 변수는 주소 값이 들어가는 것이다.
포인터 변수 선언은
자료형 *(간접 지정 연산자) 변수명이다.
//각 자료형의 주소는 각 자료형에 맞는 포인터 변수에 저장하는 것이 좋다.
int iAA = 12345678;
int* pAA = &iAA;
char* pAA2 = (char*)&iAA;
cout << "iAA 의 값 : " << iAA << endl;
cout << "pAA 의 값 : " << pAA << endl;
cout << "pAA가 가리키는 공간의 값 : " << *pAA << endl;
cout << "pAA2의 값 : " << pAA2 << endl;
cout << "pAA2가 가리키는 공간의 값 : " << *pAA2 << endl;
위에 코드에서는 iAA를 pAA2에 강제 형 변환을 통해서 강제로 넣었는데
iAA의 값이 pAA2의 공간의 값에 제대로 안 나오는 것을 확인할 수 있다.
원치 않은 값이 나올 수 있기 때문에 맞는 자료형 포인터에 쓸 것..
앞으로 함수의 매개변수 전달 방식을 배우게 되면 왜 포인터 변수를 사용해야 하는지 알게 될 것임.
포인터 변수를 사용해서 주소 값을 저장한다는 개념과 포인터 변수의 크기는 4byte 다라는 것을 숙지해야 한다.
[개발/C&C++] - (C/C++ 속성 정리) 7일 차 : 바이트의 저장순서 및 별찍기
[개발/C&C++] - (C/C++ 속성 정리) 6일 차 : 반복문(for , while)
[개발/C&C++] - (C/C++ 속성 정리) 5일 차 : 난수
[개발/C&C++] - (C/C++ 속성 정리) 4일 차 : 분기문 (숙제 있어요)
'개발 > C&C++' 카테고리의 다른 글
(C/C++ 속성 정리) 12일 차 : string 컨테이너 (0) | 2020.07.02 |
---|---|
(C/C++ 속성 정리) 11일 차 : 문자열 및 문자열 함수 (0) | 2020.07.01 |
(C/C++ 속성 정리) 10일 차 : 포인터 심화 및 2차원 배열 (0) | 2020.06.29 |
(C/C++ 속성 정리) 9일 차 : 포인터와 배열 (0) | 2020.06.28 |
(C/C++ 속성 정리) 7일 차 : 바이트의 저장순서 및 별찍기 (0) | 2020.06.25 |
(C/C++ 속성 정리) 6일 차 : 반복문(for , while) (0) | 2020.06.24 |
(C/C++ 속성 정리) 5일 차 : 난수 (0) | 2020.06.24 |
(C/C++ 속성 정리) 4일 차 : 분기문 (숙제 있어요) (0) | 2020.06.22 |