대학수업/시스템프로그래밍기초

[08] 시스템 프로그래밍 기초 (포인터 심화)

MIRIP 2022. 11. 8. 19:14
반응형

일반 배열과 포인터로 만든 배열의 차이

먼저 스트링 constants는 텍스트 세그먼트에 저장된다. 이 텍스트 세그먼트는 수정 불가하다.

배열은 스택 영역에 복사를 뜬다. 따라서 수정이 가능하다.

그러나 포인터는 스트링 콘스턴트를 텍스트 세그먼트에 둔 채로 텍스트 세그먼트의 주소값만 받아온다.

이것은 즉, 포인터 배열은 수정이 불가하다는 뜻이다.

 

# a[2][3] 배열이 있다면 다음과 같이 나타낼 수 있다.

a[0][0] == **a;

a[0][1] == *(*a+1);

a[0][2] == *(*a+2);

a[1][0] == **(a+1);

a[1][1] == *(*(a+1)+1);

a[1][2] == *(*(a+1)+2);

 

배열은 고정적으로 메모리를 할당하는 데에 비해 포인터는 그때마다 동적으로 할당한다. 따라서 포인터를 쓰면 낭비되는 메모리를 줄일 수 있다.

 

함수의 인자로 배열이 들어오면 그것의 주소값을 복사해서 보낸다. 따라서 인자로 포인터를 보내는 것과 배열을 보내는 것과 같다.

 

주소값으로 비교하는 행위는 메모리 할당은 내 권한이 아니라 운영체제의 권한이라 랜덤에 가깝다.

 

 

Function Pointer

배열의 이름이 주소값이듯 함수의 이름도 주소값이다.

 

float (*GetPtr(const char opCode))(float, float)

GetPtr은 opCode를 인자로 가지는 함수이다. 이 함수는 포인터를 리턴하고 이 포인터는 또 다른 함수를 가리킨다.

따라서 결론적으로 플롯을 리턴한다.

 

if로 문제 상황에 따른 분류보다는 포인터로 함수를 가리키게 해서 디버깅을 하면 밑에 부분을 고려하지 않아도 되기에 쉽게 프로그래밍할 수 있다.

 

switch문을 Function Pointer을 사용하여 Direct Call 방식을 사용할 수 있다.

 

int (*p[3])(int);
switch(i)

case 1:

case 2:

case 3:

에서

z = p[i-1](4);

로 바꿀 수 있다.

 

 

728x90
반응형