포인터 변수를 선언할 때 사용되는 * 연산자
그와 더불어 그 앞에 일반 변수와 같이 자료형을 표현하는데,
이 자료형은 포인터 변수에 관한 내용이 아니라, 포인터가 가리키는 변수의 값의 자료형에 관한 것이다.
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 |
'컴퓨터 사이언스 > C언어' 카테고리의 다른 글
[C언어] 포인터가 가리키는 메모리를 참조하는 * 연산자 예제 (0) | 2020.08.10 |
---|---|
[C언어] & 연산자 (Ampersand, 앰퍼샌드) (0) | 2020.08.09 |
[C언어] 포인터 변수에 있어 자료형의 의미 2 (0) | 2020.08.09 |
[C언어] 포인터 변수 선언하기(C pointer) (0) | 2020.08.09 |
[C언어] * 연산자(별표 기호, Asterisk 연산자)에 대하여: 곱하기, 포인터 변수 선언, 메모리로의 접근 (2) | 2020.08.09 |