일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바스크립트 defer
- 티스토리사진
- 스팀 사용 금액
- 백준
- 롤 현질얼마나 했는지보기
- 게임 네트워킹
- 스팀 돈얼마나 썼는지보기
- 쿠르츠 게작트
- 비주얼스튜디오 코드 글꼴
- 비주얼스튜디오 코드 폰트
- 어도비플래시서비스종료
- 명언
- 도선생님 신경론
- 롤에 돈얼마나썼지
- 티스토리 전체글수표시
- 도파 신경론
- 언리얼
- 티스토리사진한줄에 여러개
- c++
- Class1
- 롤 현질금액보기
- 티스토리전체글수
- 스팀에 돈 얼마나 썼지
- 한글 가운뎃점
- 어도비플래시삭제
- 가운뎃점 입력
- 신경론
- 티스토리 코드블록
- 자바메모
- 앤드류 테이트
- Today
- Total
Small Step
[C] 씹어먹는 C 공부 정리(~포인터) 본문
모두의 코드 사이트를 이용해 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언어에는 값을 메모리에 보관하기 위한 변수가 존재.
각 변수의 자료형마다 담을 수 있는 값의 크기와 종류가 다름.
변수가 담을 수 있는 값의 크기보다 큰 값을 담게 되면
오버플로우라는 현상이 발생하므로 자료형을 잘 선택하자.
연산자
C언어에는 다양한 연산자가 존재한다.
변수와 함께 나중에 참고하기.
반복문
반복문을 나오는 방법 중에는 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";
}
오랜만에 다시 복습을 해봤다.
확실히 어려운 개념이다.
배열은 포인터다.
배열은 결국 주소 값을 가지고 있는 것.
포인터는 자료형의 크기만큼 가짐.
이 부분은 복습하는 형식으로 해야겠다. 글로 쓰기 조금 어려운 것 같다.
함수 부분부터는 다음에 정리해야겠다.
'코딩 > C, C++' 카테고리의 다른 글
[C++] 씹어먹는 C++ 공부 정리(~오버로딩, 생성자) (0) | 2022.08.05 |
---|---|
[C] C 언어 공부 정리 - 메모리, 동적 할당 (0) | 2022.08.05 |
[C, C++] 작은 따옴표와 큰따옴표의 차이는? (0) | 2022.07.25 |