본문 바로가기

문과 코린이의, [C. C++] 기록/C++ 이론

[문과 코린이의 IT기록장] C, C++ - 포인터 정리 (포인터, &, *, 상수 포인터, 포인터의 덧셈, 포인터의 대입)

반응형

[ 변수에 대한 기본설명 ]

Int a = 123; // int는 4 byte이므로, 메모리의 4칸을 차지한다.
* 이 변수의 주소가 0x 123456이라고 가정


a = 10 ; // 메모리 0x 123456 위치에서 부터 4byte의 공간에 있는 데이터를 10으로 바꾸어라.



1. 포인터
- 포인터란? : 메모리 상에 위치한 특정한 데이터의 (시작)주소값을 보관하는 변수
- 형태 : (포인터 주소값이 저장되는 데이터의 형) *(포인터의 이름) ;

ex) int * P; // 포인터 P는 int형 데이터의 주소값을 저장하는 변수

 



2. & 연산자 ( 피연산자가 1개인 단항연산자 // AND연산자와 다르게 해석 )
- 형태 : & (주소값을 계산할 데이터)

ex) #include <iostream>
using namespace std;

int main(){
int *P; // 포인터 변수 P는, int형 데이터의 주소값을 저장한다.
int a; // 변수 a는, int형 데이터를 저장한다.

P = &a; // P는 포인터 변수

cout<<"포인터 P에 들어있는 값: << P <<endl;
cout<<"int변수 a가 저장된 주소 : << &a << endl;
// 이 두 결과는 같은 값을 출력한다.

return 0;
}


 

3. * 연산자 ( 이 또한 피연산자가 1개인 단항연산자 // 곱셈 x )
: 지정된 주소 값에 위치한 데이터를 의미
ex) 포인터변수 P(주소값을 담고 있음) -> *P (그 주소값에 담긴 내용)

 



4. 상수 포인터
 1) 상수
const : 이 데이터의 내용은 절대로 바뀔 수 없다.
ex) const int a = 3; // int형 변수 a의 값은 절대로 바뀌면 안된다. (a는 상수)

이후
a = 5; // 이런 식으로 변경시키려고 해도 변경될 수 없음. ( 컴파일 오류)
a = 3; // 비록 같은 값으로 변경시키려고 하더라도 오류가 발생함. * 값이 바뀔 가능성이 있기 때문


 2) 상수의 필요성
: 프로그래머가 프로그래밍 상에서 발생할 수 있는 실수를 줄임.
( 절대 바뀌지 않을 것이라고 생각하는 값에는 무조건 const를 붙이는 것이 좋음 )


 3) 상수 포인터
ex 1 ) #include <iostream>
using namespace std;

int main(){
int a;
int b;
const int *pa = &a; // int형 포인터변수 pa는, int형 a변수의 주소값을 가진다.

*pa = 3; // 올바르지 않은 문장. (컴파일 오류 발생)
pa = &b; // 올바른 문장.

return 0;
}


const int *pa = &a;
// int형 포인터변수 pa는, int형 변수(a)의 주소값을 가져온다. (= int형 변수를 가르킨다.)
// const가 붙은 이유 : 포인터변수 pa가 가르키는, 변수의 값은 절대로 바뀌면 안된다.

그러므로, *pa = 3; // 이 문장은 올바르지 않은 문장이다.
그러나, a=3; // 이러한 문장은 올바르게 실행된다. 왜냐하면, 변수 a 자체는 const가 아니기 때문이다.


ex 2) #include <iostream>
using namespace std;

int main(){
int a;
int b;
int *const pa = &a; // int형 포인터 상수 pa는, int형 변수(a)의 주소값을 담는다.

*pa = 3; // 올바른 문장.
pa = &b; // 올바르지 않은 문장.

return 0;
}

int *const pa = &a
// int형 포인터 상수 pa는, int형 변수(a)의 주소값을 담는다.
// 즉, pa의 값은 변할 수 없다. (주소 값이 변할 수 없다는 뜻)


ex 3) #include <iostream>
using namespace std;

int main(){
int a;
int b;
const int * const pa = &a; // *pa의 값도, pa의 값도 변경할 수 없다.

*pa = 3; // 올바르지 않은 문장.
pa = 3; // 올바르지 않은 문장.

return 0;
}

 


 

5. 포인터의 덧셈
ex 1) 포인터와 숫자의 덧셈

이 두 수 (pa와, pa+1)의 차이는 4.
+1을 했지만, 포인터변수 pa의 포인터형인, int형이 4byte이기 때문에, +4가 된다.

이와 마찬가지로, char형은 +1, double형은 +8이 될 것이다.


ex 2) 포인터와 포인터의 덧셈

포인터끼리의 덧셈은 오류가 나온다. 포인터끼리의 덧셈을 허용하지 않는 이유는?
: 포인터끼리의 덧셈은 아무런 의미가 없을뿐더러, 필요하지도 않기 때문이다.
: 두 변수의 메모리 주소를 더해서 나오는 값은 이전에 포인터들이 가리키던 두 개의 변수와 아무런 관련이 없는 메모리 속의 임의의 지점이다. (프로그램 상에 상관없는 지점)

그러나 포인터끼리의 뺄셈은 허용함.



6. 포인터의 대입
ex)

pa에 저장되어 있던 주소값을, pb에 대입하였다. 
따라서 pb도 pa가 가지고 있던 주소값을 가지게 되는 것.

* 주의사항 ) pb와 pa의 포인터변수형이 같아야 함. (같은 int*형이었기 때문에 가능한 것)


 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)

 

반응형