자이의 프로그래밍
포인터(Pointer) 본문
스코프(scope): 변수는 선언된 블록 내에서만 접근할 수 있다.
함수간 작업의 완벽한 분담을 위해서 존재한다.
서로에게 영향을 받으면 각각의 함수에 집중할 수 없다.
포인터(Pointer)의 개념과 예제: 값을 저장하는 것이 아닌, 값의 위치를 저장하는 변수
컴퓨터 내부 중에서도 저장장치(메모리)에 관한 것
int *myPointer;
//int형 변수의 주소를 저장한다.
int a;
a=5;
myPointer=&a;//a의 주소
cout<<*myPointer;//myPointer가 가리키는 변수의 값 출력
자료의 저장단위
비트(Bit): 정보의 가장 작은 단위. 0 또는 1을 담는다.
ex) 2비트- 0 또는 1을 담는 2개의 저장공간, 8비트- 0 또는 1을 담는 8개의 저장공간
바이트(Byte): 정보의 기본 단위. 8개의 비트로 이루어졌다.
RAM(Random Access Memory): 무작위 접근 저장공간-> 무작위로 접근하는 메모리
자료를 저장하기 위한 장치이다. 특정 공간에 있는 값을 access하는데 시간이 비슷하다.
NUMA(None Uniform Memory Access): 균일하지 않다. 각각 메모리에 접근하는 시간이 다르다.
Big Endian과 Little Endian: 컴퓨터가 저장하는 순서
ex) a: 00000000 00010100 01111011 10001001 (1,342,345)
Little Endian: 주소가 높을수록 높은 자리의 bit 기록
Big Endian: 주소가 높을수록 낮은 자리의 bit 기록
Little Endian | Big Endian | |
c | 10001001 | 00000000 |
d | 01111011 | 00010100 |
e | 00010100 | 01111011 |
f | 00000000 | 10001001 |
운영체제와 기억장소 할당
운영체제(Operating System): 하드웨어를 제어하기 위한 소프트웨어
기억장소할당(Memory Allocation): 변수에 값을 담기위한 과정
1. 프로그램이 운영체제에게 필요한 공간의 양을 알려준다.
2. 운영체제가 그만큼의 공간을 예약한다.(다른 프로그램이 해당 공간을 쓰지 못하게 한다.)
3. 운영체제가 해당 프로그램에게 해당 공간을 대표하는 주소를 반환한다.
기억장소의 할당을 위한 malloc
int a;
a=3;
void* malloc(int x);
//x byte의 공간을 할당하여 가장 앞의 주소를 반환하는 함수
//void*: void형 변수의 주소를 담는 포인터
연속적 기억장소 할당
int *a;
a=(int *)malloc(8);
*a=10;//a가 가리키는 곳에 10
*(a+1)=20;//a가 가리키는 다음 값에 20
call by value
(함수를) 값을 중심으로 부른다-> 함수를 호출할 때 값만 복사해서 호출
변수 자체를 넘기는 것이 아니라 값만 복사해서 옮기는 것이다.
값을 넘기는 장점과 단점
장점: 서로 관여하지 않는 완벽한 분업을 할 수 있다.
단점: 서로 관여하지 않기 때문에 굉장히 불편할 때가 많다.
개선할 수 있는 방법
*포인터를 이용한다. 값을 넘기는 대신에, 값을 갖고있는 변수의 주소를 넘긴다.
주소를 넘기는 것은 가능하면 쓰지 않는 것이 좋다. 함수의 완벽한 분업이 벗어나는 행위이기 때문이다. 즉, 완벽하게 분업이 되게끔 함수를 디자인 하는게 좋다. 하지만 잘 사용한다면 좋다. 함수의 역할만 제대로 정의가 되고, 그 정의만 벗어나지 않는다면 오히려 더 좋은 코드가 될 수 있다.
값을 넘기는 것 vs 배열을 넘기는 것
값을 넘기는 것과 배열을 넘기는 것은 결과가 서로 달라진다.
값을 넘기는 것: 값을 복사하여 함수에게 넘기므로 서로 영향을 주지 않는다.
배열을 넘기는 것: 포인터를 넘기는 것이므로 서로 영향을 줄 수 있다.
'Algorithm > Contents' 카테고리의 다른 글
문자열(String) (0) | 2020.05.03 |
---|---|
시간복잡도(Time Complexity) (0) | 2020.05.01 |
기본 정렬(Basic Sort) (0) | 2020.05.01 |