본문 바로가기

개발/C&C++

(C/C++ 속성 정리) 8일 차 : 포인터

안녕하세요 넬다이 입니다.

 

이번 시간에는 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++ 속성 정리) 3일 차 : 연산자

[개발/C&C++] - (C/C++ 속성 정리) 2일 차 : 자료형 타입과 표현 범위 및 변수 선언