Small Step

[C] 씹어먹는 C 공부 정리(~포인터) 본문

코딩/C, C++

[C] 씹어먹는 C 공부 정리(~포인터)

Esunn 2022. 8. 5. 14:19

https://modoocode.com/231

 

씹어먹는 C 언어 시작하기

 

modoocode.com

모두의 코드 사이트를 이용해 C와 C++을 한 번 다시 정리해보고자 공부를 하게 되었다.

공부하면서 기억할만한 내용을 정리해놓은 글이다.

 

 

C언어 배경 지식들

C언어는 기본적으로 시스템 프로그래밍이 주 목적이므로 시스템 관련 배경지식이 필요하다.

모든 계산은 CPU를 통해 처리된다.

CPU가 연산을 수행하기 위해서 데이터를 저장하는 공간을 레지스터(register)라고 함.

이 크기는 작기에 RAM을 이용. 램은 휘발성 메모리라는 단점이 있다.

이를 위해 하드디스크를 이용.

 

명령어 작성

램은 각각 고유 주소가 있다.

어셈블리어를 통해 CPU를 이용해 램에 값을 대입하는 것이 가능.

 

   mov     eax, 4660 # 4660 은 0x1234 를 십진수로 나타낸 것입니다.
   mov     BYTE PTR [rax], 3

어셈블리 코드이다.

 

메모리에 데이터를 접근하기 위해서는 먼저 레지스트의 값을 참조해야 함.

 

명령어를 읽어 들이는 법

CPU는 명령을 어디선가 가져와야 한다.

이를 위해 CPU가 램의 어디에서 명령어를 읽어야 할지를 알아야 하는데 

인텔 64비트 CPU에서 이 레지스터의 이름은 RIP이다.

 

만약 어셈블리어의 메모리가 실제로 사용될 수도 있으면 그 프로그램은 데이터가 손상되기에

CPU는 메모리를 효율적으로 관리하기 위해서 다른 메커니즘을 이용한다.

 

가상 메모리 vs 물리 메모리

CPU가 참조하는 메모리 주소 값을 가상 메모리, 실제 참조하는 메모리의 주소 값을 물리 메모리라고 한다.

메모리 구성을 쪼개서 쓰는데 이런 방식을 페이징(paging)이라고 하고, 최소 메모리 단위를 페이지(page)라고 한다.

 

모두의 코드에 나온 정리 

  • 모든 연산은 CPU에서 수행된다. 정확히 말하자면, CPU의 자그마한 레지스터 상에서 수행된다. 64 비트 CPU의 경우 레지스터의 크기는 8 바이트이다.
  • CPU는 무슨 연산을 할지 알려주는 명령어와, 명령어를 실행하기 위해 필요로 하는 데이터를 메모리 (램)에서 읽는다.
  • 우리가 프로그램을 실행한다는 것은 하드 디스크에 잠들어 있는 명령어들과 데이터를 메모리에 쓰는 것이라 생각하면 된다. 그리고 운영체제가 CPU에 처음으로 실행해야 할 명령어의 주소 값을 전달함으로써 프로그램이 시작된다.
  • CPU 에는 캐시가 있어서 메모리 접근 횟수를 줄일 수 있다.
  • 각 프로그램들은 마치 자신이 방대한 메모리 공간 전체를 사용하는 것처럼 생각하며 작동한다.
  • CPU에서 참조하는 주소 값은 실제 물리 메모리 주소 값이 아니라 가상 메모리 주소 값이다.
  • 가상 메모리 주소 값은 각 프로그램의 페이지 테이블을 통해서 실제 메모리 주소 값으로 변환된다.

1 C언어란?

컴파일러는 무엇일까

컴파일러는 프로그래밍 언어를 기계어로 바꾸어주는 장치이다.

 

Visual Studio를 이용

 

주석은 컴파일 과정에서 무시된다.

 

컴퓨터의 메모리 단위

0과 1을 보관하는 하나의 단위를 비트(bit)라고 함.

8비트 = 1바이트(Byte)

 

레지스터의 단위인 워드(Word)도 있다.

64비트 컴퓨터의 경우에는 1 워드 = 8바이트이고

32비트는 그의 절반인 4바이트가 된다.

 

변수

C언어에는 값을 메모리에 보관하기 위한 변수가 존재.

각 변수의 자료형마다 담을 수 있는 값의 크기와 종류가 다름.

 

https://modoocode.com/7

 

씹어먹는 C 언어 - <3. 변수가 뭐지? >

 

modoocode.com

변수가 담을 수 있는 값의 크기보다 큰 값을 담게 되면

오버플로우라는 현상이 발생하므로 자료형을 잘 선택하자.

 

연산자

C언어에는 다양한 연산자가 존재한다.

 

https://modoocode.com/8

 

씹어먹는 C 언어 - <4 - 1. 계산하리>

 

modoocode.com

변수와 함께 나중에 참고하기.

 

반복문

반복문을 나오는 방법 중에는 continue와 break가 있다.

continue는 그 반복을 넘기는 것이고 break는 아예 반복문을 탈출하는 명령이다.

 

switch문을 이용해 반복적으로 쓰는 if-else문이 있다면 대체 가능하다.

break를 이용하는 것을 빠뜨리면 안 되고 default를 이용해 else문과 같은 효과를 줄 수 있다.

 

포인터

개인적으로 포인터는 이렇게 기억했다.

먼저 &는 메모리의 주소 값이고 *는 가리키는 주소의 값이라고 기억했다.

 

#include <iostream>
using namespace std;

int main() {
	int a = 0;
	cout << a << "\n";
	
	int *p;
	p = &a;
	*p = 4;
	
	cout << a << "\n";
	cout << &a << "\n";	
	cout << p << "\n";
	cout << *p << "\n";
}

오랜만에 다시 복습을 해봤다.

확실히 어려운 개념이다.

배열은 포인터다.

배열은 결국 주소 값을 가지고 있는 것.

포인터는 자료형의 크기만큼 가짐.

 

이 부분은 복습하는 형식으로 해야겠다. 글로 쓰기 조금 어려운 것 같다.

 

https://modoocode.com/23

 

씹어먹는 C 언어 - <12 - 1. 포인터는 영희이다! (포인터)>

 

modoocode.com

 

함수 부분부터는 다음에 정리해야겠다.

Comments