C 프로그래밍 언어를 공부하다 보면
컴퓨터 언어를 처음 접하는 사람으로서 그 의미가 헷갈리는 연산자가 있다.
바로 * 연산자(별표 기호, Asterisk 연산자) 이다.
한국말에도 '배'라는 말이 신체 일부인 '배'와 먹는 '배', 타는 '배', 여러 '배'라는 여러 가지 뜻이 있듯이
이 * 연산자도 세가지의 의미가 있다.
위의 '배'는 문맥에 따라 무슨 '배'인가를 추론해내듯,
* 연산자는 * 연산이 이루어지는 피연산자가 무엇이냐에 따라서
* 연산자의 의미가 달라진다.
C 언어에서 *(별표, 에스테리스크) 연산자가 사용되는 경우는 하기의 세가지 경우이다.
1) 5 * 8 ; 피연산자가 숫자로 나올 경우
이 때, * 연산은 곱하기를 의미한다.
2) char * ptr (char* ptr, char *ptr 어느 위치여도 상관없다); 자료형명(char)과 변수명(ptr) 사이에 나올 경우
이 때, * 연산은 포인터 변수의 선언을 의미한다. 즉, char형 변수의 값을 가리키는 포인터 변수 ptr임을 의미한다.
3) *ptr; 포인터 변수명 앞에 나올 경우
이 때, * 연산은 메모리로의 접근을 의미한다. 즉, ptr이라는 포인터 변수가 가리키고 있는 메모리에 접근한다는 의미.
포인터 변수 ptr이 ch1이라는 변수를 가리키고 있다고 하자. 여기서 *ptr은 ptr이 가리키고 있는 ch1이라는 변수의
메모리에 접근하라는 것이다.
그래서, 다음과 같이 프로그램을 짠다고 하면,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
int main() {
char ch1 = 'Z';
char *ptr = &ch1;
*ptr = 'C';
.
.
.
retrun 0;
}
|
cs |
위 여섯번째 줄을 보면 *연산으로 포인터 변수를 선언(* 연산의 2번째 의미)하는 동시,
그 포인터 변수가 char형 변수 ch1를 가리키게(주소) 한다(= &ch1 // &는 변수 ch1의 주소(를 나타낸다).
위 일곱번째 줄에서는 이미 선언된 포인터 변수 ptr에 * 연산을 그 앞에 붙여(* 연산의 3번째 의미)
포인터 변수 ptr이 가리키고 있는 메모리(변수 ch1)에 접근하여 'C'라는 값을 그 메모리에 저장하도록 하고 있다.
그래서, Z가 저장되어 있던 ch1의 값이 포인터를 이용하여 접근해 결과적으로 'C'라는 값으로 바뀌어 저장된다.
ptr이 포인터 변수로 선언된 이후에는 *ptr은 ptr이 가리키는 변수 ch1의 메모리에 접근하라는 뜻이므로
곧, ch1을 의미(*ptr = ch1)하게 된다.
보통 C 언어로 프로그래밍 공부를 시작할 때 2)번과 3)번을 구별하지 못해 혼란을 겪게 되는 경우가 매우 많기때문에, 위의 세가지 중에서 2)번과 3)번을 정확히 이해하고 구분하며, 사용할 줄 아는 것이 중요하다.
결론은, * 연산의 의미가 수학과 같이 곱하기의 의미 뿐만 아니라, 포인터 변수의 선언 그리고, 포인터 변수가 가리키고 있는 메모리로의 접근을 의미하는 것을 안다면 어느 곳에서 만나도 당황하지 않고, 피연산자에 따라 잘 적용하고 이해하리라 생각한다.
'컴퓨터 사이언스 > C언어' 카테고리의 다른 글
[C언어] 포인터가 가리키는 메모리를 참조하는 * 연산자 예제 (0) | 2020.08.10 |
---|---|
[C언어] & 연산자 (Ampersand, 앰퍼샌드) (0) | 2020.08.09 |
[C언어] 포인터 변수에 있어 자료형의 의미 2 (0) | 2020.08.09 |
[C언어] 포인터 변수에 있어 자료형의 의미 1 (0) | 2020.08.09 |
[C언어] 포인터 변수 선언하기(C pointer) (0) | 2020.08.09 |