Search

반응형

'2025/04'에 해당되는 글 1건

  1. 2025.04.04 C 언어 포인터 시리즈 1탄: 초보자를 위한 포인터 정의와 기본 데이터형 포인터 완벽 가이드, Pointer, 사용하는 방법.
반응형

C 언어 포인터 시리즈 1탄!

 

인공지능 개발자가 되고 싶은가?

대학에서 컴퓨터공학(컴공) 전공인가?

C 언어를 배우고 싶은데 포인터(Pointer)가 어려워서 힘든가?

C 언어 하면 딱 떠오르는 것! 어려워 어려워.

바로 포인터다. Pointer.

나도 처음 C 언어 포인터(Pointer)를 공부할 때 정말 헷갈렸다.

방금 이해한 듯했지만 다시 보면 또 틀렸다.

그래서 이번 기회에 제대로 쉽게 정리하고자 한다.

어렵게 생각하지 말고 쉽게 설명했으니 천천히 읽어보길 바란다.

C 언어 포인터(Pointer)란? 

C언어에서 가장 큰 비중을 차지하는, 모르면 C를 할 수 없는 그 포인터의 정의를 내려본다.

정의 : 포인터는 메모리 주소를 저장하는 변수.

이것이 무슨 말일까? 메모리 주소를 저장한다?

변수는 값을 저장한다.

데이터 형에 따라 지정된 값을 저장한다. 

C에서 기본 데이터 형은

정수형 (int, short, long, long long),

실수형 (float, double, long double).

문자형 (char)

불린형, void형이 있다.

예를 들어보자.

정수형 int에는 실수형이나 문자형을 저장(할당)할 수 없다. 

사이즈에 맞게 정수만 저장 가능하다.

문자형 char에 숫자를 저장할 수 없다. ('3'처럼 따옴표를 붙이면 숫자가 아닌 문자임)

포인터 변수는 메모리 주소값만 저장 가능하다.

다시 강조한다.

포인터 변수는 숫자, 문자가 아닌 메모리 주소값만 저장 가능하다.

 

주소연산자 '&'와 메모리 주소

메모리 주소는 무엇을 의미하고 어떻게 쓰는가?

메모리에는 1byte 당 물리적 주소값이 있다.

10진수나 16진수로 표현할 수 있고 집주소처럼 번지값이 정해져 있다.

결과 : int_size=4

int 형 사이즈는 4byte다.

int 형으로 변수를 선언하면 4byte, 4개의 주소를 사용한다.

메모리

빨간색 숫자인 1001~1004까지가 int 형 변수 길이다.

5열 int 형 변수 i 선언 및 값 저장

위 코드 5라인을 보면 int 형 변수 i를 선언하고 바로 100을 저장(할당)했다. 

실행하면 int 형 i는 메모리 어딘가에 저장된다.

메모리 주소는 어떻게 확인할까?

바로 주소연산자인 &를 붙이면 된다.

주소를 확인하는 코드를 보자.

위 코드 8~10에서 printf 안에 &i 형태로 변수 i 앞에 주소 연산자 &를 붙였다.

빌드 후 실행 결과는 다음과 같다.

7번 라인은 i에 저장된 값 100을  출력했다.

8번 라인의 %d 결과는 6291100으로 변수 i의 주소값이 정수로 출력했다. (%d는 정수 매칭)

9번 라인의 %p 결과는 16진수로 출력했다. (%p는 포인트주소 16진수 매칭)

10번 라인의 %u 결과는 6291100으로 변수 i의 주소값이 정수로 출력했다. (%u는 포인트주소 10진수 매칭)

이제 우리는 변수의 메모리 주소를 주소연산자&를 붙여서 얻는 방법을 알았다.

정리하면,

변수 i만 사용하면 변수에 저장된 값 100을 꺼내오고

주소연산자(&)를 변수 앞에 붙인 &i는 주소값 6291100을 꺼내오게 된다.

 

참조연산자, 역참조연산자, 포인터변수 선언  '*' 

그렇다면,

주소연산자(&)로 받은 주소값은 저장할 수 있는가?

키보드 숫자 8에 있는 * 참조연산자를 사용하면 된다. (역참조도 있지만 쉽게 참조로 통일)

* 참조연산자는 주소(&)지의 문을 열어준다. 라고 생각하자.

주소지에 가면 주소값만 보인다.

주소지를 찾아가 문을 열고 실제 저장된 값을 보거나 또는 값을 다른 저장하려면 * 참조연산자가 필요하다.

* 참조연산자가  주소값을 가지고 찾아가 문을 연다.

이해가 되었는가?

사용 방법을 보자.

주소를 받을 포인트 변수가 필요하다.

처음 설명했던 부분이다.

포인터 변수는 메모리 주소값만 저장 가능하다.

참조연산자 를 사용하면 포인터 변수를 선언할 수 있다.

int* pa; 또는 int *pa;로 선언한다. 

int형 변수의 주소값을 저장하는 포인트 변수 pa를 선언한다.

*을 붙여 선언했으니 너는 이제 포인트형 변수가 되었다~라는 의미다.

*을 달고 pa에 저장된 주소값 위치로 가서 문을 열 수 있다고 이해하자.

 

int a = 10; 으로 변수 a를 선언하고 10을 저장한다.

pa = &a; pa는 변수의 주소값만 저장할 수 있다.

*로 선언된 포인트 변수 pa에 원하는 변수에 & 사용한 주소값을 저장한다.

여기서 잠깐! pa 앞에 왜? *가 없는가?

그 이유는 다음과 같다.

 

pa에 *를 붙이게 되면 pa에 저장된 주소(&a)로 가서 변수 a의 데이터를 꺼내거나 저장하는 작업을 시도한다.

pa에 주소를 저장하려면 * 붙이면 안되는 이유다. 

만약 *pa = &a;로 하면 오류가 나는데 이유는 *가 붙었기에 *pa는 해당 주소지에 가서 문을 열고 저장하려고 한다.

하지만 저장하려는 &a는 주소값이라 저장할 수 없어서 오류가 난다.

만약 주소를 받으려 했다면 포인트 변수로 선언한 pa가 저장된 주소지로 가서 문을 열게 하지 말고(* 없이)

pa를 사용해서 주소값(&a) 을 받아야 한다.

pa는 주소값을 받으려 int형으로 선언된 포인트 변수이기 때문이다.

 

int b; 선언하자.

b = &a; 는 오류가 난다. 왜? b는 포인트 변수가 아니라 주소값을 받을 수 없기 때문이다.

b = pa; 도 오류가 난다. 왜? pa에 a의 주소값이 저장되어 있다.

그런데 포인트 변수가 아닌 b에 시도했기 때문이다.

b = *pa; 는 어떨까?

*pa는 *가 붙어서 pa에 저장된 주소지로 찾아가 문을 열고 안의 값을 꺼내서 b에게 준다.

오류 없이 잘 실행된다.

 

주소연산자&와 참조연산자* 코딩하기

간단한 포인터 프로그램을 만들어 보자.

5번 라인 : int형 변수 a를 선언하고 숫자 100을 저장(할당)한다.

6번 라인 : int형 변수 b를 선언만 한다. 

8번 라인 : int형 포인트 변수 pa는 *을 사용해서 선언한다. 너는 이제 주소값만 받을 수 있다.

9번 라인 : int형 포인트 변수 pa는 &a 주소값을 저장해라!

10번 라인 : pa에 *가 붙어있다. pa에 저장된 주소값(&a)을 찾아가 그 값(100)을 받아 int형 변수 b에 저장해라!

12번 라인 : pa에 있는 주소값(&a)를 int형 변수 b에 저장하라! 안됩니다!!!!! 변수 b에는 정수만 가능합니다. 

주소값은 *이 붙여진 포인트형으로 선언된 변수만 가능합니다!!!

 

이제 포인트 변수, 참조연산자 *와 주소연산자 &에 대한 이야기가 끝났다.

기본 데이터형인 정수형, 실수형, 문자형에 적용된 이야기다.

배열, 문자열처럼 열이 들어간 데이터 형은 사용함에 다른 부분이 있다.

이 부분은 다음 시리즈에서 다뤄볼 예정이다.

사진: Unsplash 의 James Harrison

마지막으로,위 11번 라인을 보면 

b=*&a;

로 코딩되었는데 무슨 의미일까?

다음 시리즈에서 알려주겠다!

^^열코딩! 끝.

 

 

반응형