반응형

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;

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

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

^^열코딩! 끝.

 

 

반응형
반응형

안녕하세요. 신기한 연구소입니다.

오랜만에 C 프로그램 포스팅을 준비하는데 Visual Studio Code(VSCode)에 세팅이 안되어 있더군요.

별생각 없이 VSCode에서 C로 코딩하고 저장 후 컴파일을 했는데 확장팩을 설치하라는 메시지가 뜨더군요.

확장팩을 설치했음에도 컴파일이 안 돼서 생각해 보니 Visual Studio Code(VSCode)는 그냥 에디터였어요.

파이썬도 자바도 해당 프로그램을 설치해야 제대로 실행이 됩니다.

그렇다면 C/C++도 마찬가지!그래서 검색해 봤습니다.

 

이 포스팅은

VSCode에서 C/C++을 사용하고 싶은 개발자,

MinGW를 설치하는데 bin이 누락되어 당황한 개발자를 위해 

최대한 쉽게 따라 하며 설치할 수 있도록 구성해 봤습니다.

Visual Studio Code(VSCode)에서 C/C++ 세팅하기.

 

MinGW w64 설치 시도

Visual Studio Code(VSCode)에서 C/C++ 코딩을 하기 위해서는 MinGW를 설치가 필요하다는 것을 알았습니다.

해당 사이트에 가서 다운로드하고 압축을 풀었습니다.

MinGW 사이트 ( https://www.mingw-w64.org/ )

압축을 푼 폴더에 가면 bin 폴더가 있고 환경변수에 넣으라고 하는데 bin 폴더가 사라졌습니다.

아무리 찾아도 bin 폴더가 없다

bin 폴더가 실종되었습니다.

누락된 건가? 버그인가?

다른 버전을 몇 개 받았지만 역시 없다.

내가 못 찾는 건가?

어딨지? bin?

좀 더 인공지능적으로 검색해 봤습니다.

최근 정보에 따르면 MinGW의 최신 버전이 더 이상 독립 실행형 설치 파일로 제공되지 않는다고 합니다.

MSYS2와 같은 패키지 관리자를 통해 설치하도록 권장되기 때문이라고 합니다.

어쩐지 이상하다 했습니다.

검색한 정보들에서 찾은 대부분 MinGW 설치글은 bin 폴더가 있던 시기에 대부분 작성되었더군요.

그래서 혼란이 왔던 겁니다.

"bin 폴더 없음"으로 검색한 개발자라면 공감할 겁니다.

비주얼스튜디오코드(VSCode) 사이트는 어떤가 확인해 보니 역시 MSYS2를 권장하더군요.

그래서 Visual Studio Code(VSCode) 사이트의 설치 방법대로 진행해 볼게요.!!

혹시 최신 MinGW에서 bin 찾으신 분 있음 댓글 주세요~~!!

Visual Studio Code(VSCode)에서 정보 찾기

해당 사이트로 이동해 봅니다. (https://code.visualstudio.com/docs/cpp/config-mingw)

왼쪽 아래를 보면 C++메뉴가 보입니다.

C++

C++을 클릭하면 더 많은 상세 메뉴가 보입니다.

Windows 운영체제에서 설치하기 때문에 GCC on Windows를 클릭합니다.

웹페이지가 열리면 가장 위 제목이 보인다.

영어로 되어 있지만 번역하면서 보면 쉽게 이해할 수 있습니다.

 

Visual Studio Code에서 MinGW를 사용해 C/C++ 설치하기

 

VSCode 설치하기

가장 먼저 필요한 것은 VSCode(VisualStudioCode)입니다.

기존에 설치 관련 글을 확인해 보세요.

2023.05.20 - [Software/Settings] - VSCode 설치하는 방법. (visual studio code, 비주얼 스튜디오 코드)

 

VSCode 설치하는 방법. (visual studio code, 비주얼 스튜디오 코드)

안녕하세요. 신기한 연구소입니다. 보통 이클립스(eclipse)에서 많은 개발을 했었고 예전에는 울트라 에디트나 에디트 플러스에서 코딩했던 기억이 있습니다. 요즘은 프론트엔드 뿐만 아니라 백

tiboy.tistory.com

VSCode를 설치했다면 실행합니다.

 

C/C++ 확장팩 설치. (extension)

Ctrl + Shift + X 키를 누릅니다. (키보드 왼쪽 아래 Ctrl키를 누른 상태에서 바로 위 Shift도 누른 상태에서 X를 누름)

또는

제일 왼쪽 아이콘 중 위 모양을 클릭합니다.

"C++"로 검색합니다.

파란색 "설치"버튼을 클릭하면 설치가 됩니다.

설치 시간은 좀 걸립니다.

설치가 완료되면 아래 이미지처럼 파란색 버튼이 "사용 안 함"으로 바뀝니다.

그러면 설치가 잘 된 겁니다.

 

MSYS2로 MinGW 최신 버전 설치

MSYS2는 최신 GCC, MinGW-w64, 및 유용한 C++ 도구와 라이브러리 네이티브 빌드를 제공한다고 합니다.

코드 컴파일, 디버그 및 인텔리센스(IntelliSense)와의 호환 설정에 필요한 도구도 갖출 수 있다고 합니다.

MSYS2 사이트로 이동해서 설치하기. ( https://www.msys2.org/ )

위 이미지에서 .exe 파일을 클릭하면 됩니다.

25년 2월 21일 자 버전이네요.

다운로드가 완료되면 해당 폴더로 이동합니다.

Shift키를 누른 상태에서 마우스 우측 클릭을 합니다.

Microsoft Defender로 한 번 검사해 줍니다. (필수는 아닙니다 ^^)

참고로 MSYS2는 Windows 8.1 이상, 64bit 사양이 필요합니다.

이제 해당 파일을 더블클릭해서 실행합니다.

실행하면 나타나는 첫 번째 화면입니다.

Next를 클릭합니다.

설치 위치를 지정할 수 있습니다.

Browse... 를 클릭하면 다른 위치에 설치 가능합니다.

여기서는 저 경로 그대로 진행합니다.

Next를 클릭합니다.

시작 메뉴에 등록한다는 의미입니다.

Next를 클릭합니다.

설치가 진행됩니다. 

빨간색 바가 끝까지 가면 100% 설치가 완료됩니다.

시간이 좀 걸리므로 기다립니다.

설치가 완료되면 위 화면이 나옵니다.

바로 세팅을 해야 하므로 Run MSYS2 now. 가 체크된 상태로 Finish를 클릭합니다.

UCRT64

위 콘솔화면이 뜨고 UCRT64 ~가 나오면 됩니다.

혹시 콘솔화면을 껐다면 다음과 같이 실행하면 됩니다.

윈도우 키를 클릭합니다. 

우측 상단의 "모두 >" 버튼을 클릭합니다.

MSYS2 폴더를 찾으면 제일 하단의 MSYS2 UCRT64를 클릭합니다.

같은 콘솔 화면이 나타날 겁니다.

콘솔 화면에 다음과 같이 입력하고 엔터를 누릅니다.

pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain

입력하기 힘들면 복사한 뒤 콘솔 화면에 우클릭 후 paste를 클릭하면 됩니다.

위 화면이 나오면 오류 없이 진행 중입니다.

엔터를 누릅니다.

Proceed with installation? [Y/n]이 나오면 위 화면처럼 Y를 입력하고 엔터를 누릅니다.

설치가 완료되면 위 화면처럼 다시 $ 프롬프트가 나옵니다.

이제 환경설정을 합니다.

윈도우 키 + R을 누르면 실행창이 뜹니다.

sysdm.cpl을 입력하면 시스템 속성 창이 뜹니다.

우측 하단의 환경 변수(N)... 을 클릭합니다.

위 사용자 변수 중 path에 추가할 정보가 있습니다.

편집 버튼을 클릭합니다.

새로 만들기를 클릭하고 경로를 입력합니다.

C:\msys64\ucrt64\bin

위 경로는 설치할 때 경로를 의미합니다.

설치 경로를 다르게 했다면 맞게 넣어주세요.

이제 확인을 연속 눌러서 시스템 속성을 닫으면 됩니다.

환경 변수가 제대로 적용되었는지 확인해 봅니다.

윈도우 + R 키를 누른 후 실행창이나 하단의 검색에 cmd를 입력합니다.

gcc --version을 입력하고 엔터를 누릅니다.

잘 설치되었다면 위 화면처럼 버전이 나옵니다. 14.2.0

혹시 안되면 환경 변수 경로가 맞는지 다시 확인해 보세요.

그래도 안되면 시스템 변수의 path에도 같은 방식으로 추가해 봅니다.

여기까지 오느라 수고했습니다.

VSCode와 확장팩을 설치했습니다.

MSYS2와 MinGW v64 설치 및 환경 변수 설정도 끝났습니다.

 

VSCode에서 C/C++ 코딩하기.

이제 Visual Studio Code(VSCode)에서 실제 C와 C++ 코드를 작성해 봅니다.

빌드, 컴파일 및 실행까지 잘 되는지 확인해 봅니다.

윈도우 + R을 눌러 실행창을 연 뒤 cmd를 입력합니다.

프로젝트를 생성할 폴더를 만들고 이동합니다.

code. 을 입력하고 엔터를 누르면 VSCode가 해당 폴더를 기준으로 실행됩니다.

혹시 신뢰에 대한 메시지가 뜨면 당황하지 마세요.

여러분이 작성한 폴더이기에 체크 후 "예, 작성자를 신뢰합니다"를 클릭합니다.

왼쪽 위를 보면 HELLO 옆에 파일 추가 버튼이 있습니다.

클릭하고 HelloWorld.c를 입력하고 엔터를 누릅니다.

오른쪽을 보면 HelloWorld.c 탭이 생성되고 아래 코드를 입력할 수 있는 에디터가 활성화됩니다.

1번 줄부터 코딩을 시작합니다.

위 소스와 같이 코딩을 했다면 Ctrl+s 를 눌러 저장합니다. (메뉴에서 저장을 클릭해도 됩니다)

VSCode 우측 상단을 보면 삼각형 모양의 실행 버튼이 있습니다.

삼각형 옆에 작은 옵션 버튼을 클릭하면 다음과 같이 나옵니다.

Run C/C++ File를 클릭합니다.

가운데 다음과 같은 선택 옵션이 나옵니다.

"C/C++: gcc.exe 활성 파일 빌드 및 디버그"를 클릭합니다.

다음과 같이 빌드되는 상태가 하단에 나옵니다.

이 결과가 나왔다면 왼쪽 목록을 확인합니다.

왼쪽 목록에 아래와 같은 HelloWorld.exe파일이 새로 만들어졌을 겁니다.

다시 우측 삼각형 실행 버튼을 클릭합니다.

HelloWorld가 잘 출력됩니다.

 

C++ 코딩해 보기

C++도 비슷하지만 다른 부분이 있습니다.

먼저 C++용 폴더를 생성합니다.

VSCode에서 제공한 C++ 코드를 그대로 사용해 보겠습니다.

이제 우측 삼각형 실행 버튼 옵션에서 Run C/C++ Files를 클릭합니다.

아래와 같은 옵션이 나옵니다.

C++은 C와 다르게 g++.exe가 있는 옵션을 선택해야 합니다. gcc.exe는 빌드 오류가 납니다.

(C/C++: g++.exe 활성 파일 빌드 및 디버그)

빌드 결과가 나오고 HelloWorld.exe 파일이 생성됩니다.

우측 삼각형 버튼을 클릭하면 실행되고 결과가 맞게 나옵니다.

Hello C++ World from VS Code and the C++ extension! 

혹시 아래와 같은 오류가 컴파일러를 잘못 선택한 경우입니다.

 이런 경우는 수정하는 방법이 있습니다.

왼쪽 .vscode를 보면 tasks.json이 있습니다.

파일을 열면 아래 화면처럼 나옵니다.

다음과 같이 수정하면 됩니다.

label, command에서 gcc를 g++로 바꿔줍니다.

저장 후 우측 삼각형 버튼을 클릭하면 정상 실행됨을 알 수 있습니다.

결론은 C는 gcc/g++ 둘 다 가능하지만 C++는 g++로 선택해야 오류가 없습니다.

둘 다 g++로 하면 좋겠네요.

이제 설정을 마쳤습니다.

모두 수고하셨습니다.

이제 우리는 VSCode에서 열심히 C/C++ 코딩을 즐길 수 있게 되었습니다.

모두 열코딩 하세요.

 

궁금한 사항, 잘못된 부분은 댓글 주세요!

반응형