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

[C언어] * 연산자(별표 기호, Asterisk 연산자)에 대하여: 곱하기, 포인터 변수 선언, 메모리로의 접근

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

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)번을 정확히 이해하고 구분하며, 사용할 줄 아는 것이 중요하다.

 

결론은, * 연산의 의미가 수학과 같이 곱하기의 의미 뿐만 아니라, 포인터 변수의 선언 그리고, 포인터 변수가 가리키고 있는 메모리로의 접근을 의미하는 것을 안다면 어느 곳에서 만나도 당황하지 않고, 피연산자에 따라 잘 적용하고 이해하리라 생각한다.