본문 바로가기
컴퓨터 사이언스/C언어

[C언어] 포인터 변수에 있어 자료형의 의미 1

by 메리뉴데이 2020. 8. 9.

포인터 변수를 선언할 때 사용되는 * 연산자

그와 더불어 그 앞에 일반 변수와 같이 자료형을 표현하는데,

이 자료형은 포인터 변수에 관한 내용이 아니라, 포인터가 가리키는 변수의 값의 자료형에 관한 것이다.

 

int * ptr 이라고 할 때,

포인터 변수 ptr 앞에 붙는 자료형 int는

ptr이 가리키는 변수(엄밀히 말하면, 그 변수의 메모리에 저장된 값)의 자료형을 나타낸다.

 

int ptr = &num에서 처럼, 

그냥 일반 변수 ptr에 변수 num의 주소값을 저장할 수는 있지만, 

이럴 경우, 일반 변수 ptr은 변수 num의 주소값 외에는 num이라는 변수(메모리)에 저장된 값에 대한 정보는 알 수가 없다. 여기서 자료형 int는 오롯이 ptr이라는 변수가 정수형이라는 정보일 뿐이다. 

그래서,

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main() {
 
int ptr;
 
*ptr = 20;
 
}
 
cs

라고 하면, 여기서 ptr이라는 변수가 정수형이라는 정보만 있지, ptr이 접근하는(*ptr) 변수에 대한 정보가 없기 때문에,

ptr이 접근하는 그 변수(메모리)에 20이라는 값을 정수형으로 저장해야 하는지, 실수형으로 저장해야 하는지 등 알 수가 없어

컴파일러는 에러를 띄운다.

 

하지만,

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main() {
 
int * ptr;
 
*ptr = 20;
 
}
 
cs

 

int * ptr이라고 하면, ptr이 포인터 변수라는 선언을 하면서

그 앞에 붙는 자료형 int는 포인터 ptr이 가리키는 변수에 저장된 값이 정수형이라는 정보를 나타내는 것이다.

따라서, ptr이 가리키는 변수가 정수형이라는 정보가 생기기 때문에, 그 변수에 20이라는 값을 저장할 때

정수형으로 20을 저장하도록 정해지기 때문에 위와 같은 에러를 발생시키지 않는다.

 

아래에서 다시 살펴보면, ptr1과 ptr2가 각각 자료형 int와 double로 표현한 건 각각의 포인터가 가리키는 값 50, 1.23의 자료형이 int, double로 다르기 때문이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main() {
 
    int num1 = 50;
 
    int * ptr1 = &num1;
 
    double num2 = 1.23;
 
    double * ptr2 = &num2;
 
    *ptr1 = 100;
 
    *ptr2 = 3.14;
 
}
 
cs