새소식

C, C++/C Pointer

1. 포인터

  • -

 

포인터는 C 언어의 꽃이다.

 

이게 포인터다.

1. 시작하기

 

1.1 C 언어의 난이도 

 

C, C++ 언어는 상대적으로 어렵다. 

학생들이 기피하여 줄어들자 교육기관에서 가르치는 공급도 줄었다.

현역은 현업이 돈을 더 많이 벌게 되어 가르칠 이유가 없어졌다.

가르치는 것과 이해하고 사용하는 것은 다른 분야이기에 교육의 질도 떨어졌다.

 

C, C++ 이 작은 프로그램 구현을 위해  배워야 하는게 100이라면, C#, Java, Python의 경우는 절반 정도다.

하지만, C#, Java, Python 같은 얼핏 쉬워 보이는 언어도, 결국에는  C, C++의 100만큼 다 공부해야 한다.

결국 개발자는 컴퓨터의 소프트웨어와 하드웨어의 동작 구조를 알아야 한다.

 

매를 먼저 맞느냐, 나중에 맞느냐 차이다.

C, C++ 로 먼저 맞는게 낫다. 

왜냐면 50 정도만 배워 시작했던 분들이 그걸로 먹고 살만하니까, 100을 다 배우려 하지 않고 발전하지 않더라.

 

1.2 포인터 학습 방법

 

프로그래밍 언어는 프로그래밍을 위해 만들어졌다.

학습자를 고려한 학문이 아니다.

프로그램을 만들기 위해 C 언어의 모든 프로그래밍 기술은 상호 보완적으로 유기적으로 연결되어 있다.

책을 기준으로 순서대로 하나씩 공부하고, 전체를 이해한 후 계속, 계속, 또 계속 봐야한다.  

 

학습일지와 개념과 용어 정리

- 학습일지를 적지 않으면, 이상복 교수님이 학생들을 파악하기 어렵다 > 취업 안됨.

- 개발자는 평생 공부해야 하는 기술 직종이다. 지금부터 자신만의 공부 방법을 찾아야 한다.

 

1.3 포인터 학습 목표

 

"포인터는 포인터다." 라고 말 할 수 있을때까지 공부한다.

포인터  소스 코드를 보고, 메모리 구조를 머리 속에 그릴 수 있어야 한다.

추상화를 이해해야 한다.

어렵게 가르친 사람의 말을 듣지 말자. 

소스 코드로 포인터를 이해하지 말자.

컴퓨터 관점에서 생각하고, 결국 메모리 주소값이 필요한 이유를 이해해야 한다.

 

형광색 색칠된 부분 위주로 이해한다.

포인터 이전 기본적인 사항은 한번 이상 공부한 것으로 여긴다.

 

 

2. 하드웨어

 

2.1 관점 

하드웨어란?

  • (컴퓨터를 구성하고 있는) 기계다

소프트웨어란?

  • 사용자가 원하는 것을, 하드웨어로 처리하는 방법과 순서가 기술된 명령문이다.

개발자란?

  • 소스코드로 로직을 구현하여 하드웨어를 다루는 사람이다. 
  • 개발자는, 하드웨어를 제어하는 소프트웨어를 만드는 사람이다.

정리

  • 개발자는, 소프트웨어로 하드웨어를 제어하는 소스 코드를 구현해 프로그램을 만드는 사람이다.
  • 즉, 소프트웨어가 하드웨어에서 어떻게 동작하는지를 이해해야 한다.
  • 하드웨어, 소프트웨어, 개발자 같은 기초 용어 조차 정리 되어 있지 않으면 면접도 통과 못한다.
    말이 안통하는데, 회사에서 협을 어떻게 할 수 있을까

 

2.2  컴퓨터

정리

  • CPU, RAM(주 저장장치), Storage(보조 저장장치) 와 같은 컴퓨터 내부 구조를 파악한다.

 

 

3. 비트와 바이트

 

3.1 bit 

 

정리

  • 컴퓨터는 0과 1만 다룬다.
    0과 1은 전기가 "통한다", "안 통한다" 또는 "있다", "없다"의 상태를 의미한다. 
  • 2가지 경우의 수에 해당한다.
    이를 편리하게 2진수로 계산하는 것 뿐이다.

 

3.2 경우의 수

 

 

 

3.3 Binary

 

 

 

3.4 Byte 

 

1bit 는 데이터의 최소 단위다.

1Byte 는 컴퓨터의 최소 처리 단위

 

3.5 데이터의 저장

 

1 bit 를 저장해도, 최소 1byte 단위로 저장된다.

int 변수에 1bit를 저장해도 4byte가 사용된다.

 

 

4.  2진수와 16진수

 

 

 

5. 빌드와 실행 그리고 메모리

 

5.1 프로그래밍과 빌드 

 

 

 

5.2 프로그래밍과 실행

 

 

 

정리

  • 내가 작성한 소스 코드가 컴파일 후 실행파일로 저장되는 프로세스를 이해한다.
  • 저장된 실행파일이 어떻게 실행되는지 이해한다.

 

 

5.3 보조 저장장치 (storage)

 

  • 저장 장치의 발전 과정 보기
  • bit 로 관리되는 컴퓨터 데이터 단위는 실제 물리적인 저장 장치에 저장된다.
  • 0과 1의 2가지 상태를 연산하여 컴퓨터가 동작한다.
  • 전기가 "있다", "없다" & 패턴이 "같다", "같지 않다"

 

 

 

5.4 주 저장장치 (메모리)

 

 

 

5.5 메모리

 

  • 1bit 하나는 2진수 한자리의 0, 1을 나타낸다.
  • 8bit 는 1Byte 로 2진수 8자리를 나타낼 수 있다.
  • 1Byte는 2진수 0000_0000 ~ 1111_1111 범위를 가지고, 그 중 1개를 나타낼 수 있다.
  • 1Byte는 10진수 0 ~ 255 범위를 가지고, 그 중 1개를 나타낼 수 있다.
  • 엔디안 추가 공부 링크

 

 

더보기

메모리를 머리 속에 그리고, 자료형을 왜 사용하는지 이해할 필요가 있다.

#include <stdio.h>

void main()
{

	//1. 16진수 0x1a2b3c4d, int 자료형 var 변수에 저장
	int var = 0x1a2b3c4d;
	printf("1. 16진수 0x1a2b3c4d, int 자료형 var 변수에 저장\n");
	printf("int var = %x;\n\n", var);


	// 2. 16진수 0x1a2b3c4d 데이터를 출력
	printf("2. var 출력\n");
	printf("int var = %x;\n\n", var);


	// 3. char* 포인터 자료형 ptr 변수에 var의 포인터를 저장;
	char* ptr = &var;
	printf("3. char* 포인터 자료형 ptr 변수에 var의 포인터를 저장;\n");
	printf("char* ptr = &var;\n");
	printf("char* ptr = %p;\n", ptr);


	// 4. 포인터 변수 ptr 에 들어있는 1바이트씩 출력(1)
	//    포인터 (연산)
	printf("\n4. 포인터 변수 ptr 에 들어있는 1바이트씩 출력(1)\n");
	printf("*(ptr+0) == %x\n", *(ptr + 0));
	printf("*(ptr+1) == %x\n", *(ptr + 1));
	printf("*(ptr+2) == %x\n", *(ptr + 2));
	printf("*(ptr+3) == %x\n", *(ptr + 3));


	// 5. 포인터 변수 ptr 에 들어있는 1바이트씩 출력(2)
	//    포인터 [연산]
	printf("\n5. 포인터 변수 ptr 에 들어있는 1바이트씩 출력(2)\n");
	printf("ptr[0] == %x\n", ptr[0]);
	printf("ptr[1] == %x\n", ptr[1]);
	printf("ptr[2] == %x\n", ptr[2]);
	printf("ptr[3] == %x\n", ptr[3]);


	// 6. int* 포인터 자료형 ptr_int 변수에 var의 포인터를 저장;
	printf("\n=3번, 4번, 5번과 비교\nchar* 포인터 자료형과 int* 자료형 비교=\n");
	int* ptr_int = &var;
	printf("int* ptr_int = &var;\n");
	printf("int* ptr_int = %p;\n\n", ptr);

	printf("ptr_int[0] == %x\n", ptr_int[0]);
	printf("ptr_int[1] == %x\n", ptr_int[1]);
	printf("ptr_int[2] == %x\n", ptr_int[2]);
	printf("ptr_int[3] == %x\n", ptr_int[3]);

}

 

6. 자료형

 

정리

  • 메모리 에서 데이터가 메모리에 어떻게 저장되는지 이해해야 한다.
  • 데이터가 메모리에 저장되는 공간을 머리속에 그릴 수 있어야 한다.
  • 자료형에 따라 메모리의 저장 공간 크기가 달라지는 것을 이해해야 한다.

 

링크

 

-

대한민국 모임의 시작, 네이버 카페

cafe.naver.com

 

 

7.  프로그래밍 언어

 

7.1  프로그래밍 언어는 왜 등장했을까?

 

  • 그러면, 프로그래밍 언어는 왜 등장했을까? 
    • 프로그램을 만들때 효율적만들고 싶었다.
    • C언어 책의 모든 기술은, 프로그램을 효율적으로 만들기 위한 방법이다.
      어떤 필요에 의해 만들어졌는지 관점을 달리 공부해야 한다.

 

  • 컴퓨터는 변수명이 필요 할까?
    • 컴퓨터는 0과 1만 있으면 된다.

 

 

 

7.2 실행 관점에서 컴퓨터는 변수명이 필요한가?

 

 

 

 

 

8. 함수와 메모리

 

8.1 함수와 스텍 프레임 (1)

 

 

 

8.2 함수와 스텍 프레임 (2)

 

  • 소스 코드와 메모리 관리

 

 

 

8.3 함수와 스텍 프레임 (3)

 

 

정리

  • 함수 프레임은 호출된 다른 스텍 프레임의 지역 변수를 침범 할 수 없다.
  • 메모리 주소를 통해 데이터를 조작하는 방법이 유일하다.
  • 지역 변수와 전역 변수를 구분짓는 이유이기도 하다.

 

 

추가. 

 

- 논리 게이트

 

 

 

 

반가산기(半加算器, half adder)

 

 

 

입력 (A), 입력(B), 출력 (S), 자리올림수(C) 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.