일반 배열과 포인터로 만든 배열의 차이
먼저 스트링 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);
로 바꿀 수 있다.