본문 바로가기

분류 전체보기252

포인터 #7(배열을 함수의 인자로 넘기는 방법) -1차원 배열을 함수의 인자로 넘기기C에서 배열의 크기는 메모리 공간을 할당할 때만 필요하지 실행시에는 배열의 크기에 대해서 컴파일러가 신경써주지 않는다. 그래서, 함수가 배열을 인자로 받을 때 그 배열이 몇 개의 요소를 가지는지는 전혀 알 방법이 없다. 해결 방법으로, 1.배열 자체에 배열의 끝을 나타내는 요소가 있으면배열의 크기를 넘길 필요가 없다. 대표적인 예로, 문자열을 다룰 때 쓰인다. char형의 배열을 구현하는데 특별히 문자열의 크기에 신경을 쓰지 않음을 알고 있을 것이다. 그것은 배열의 끝을 나타내는 0(NULL)이 문자열의 끝에 붙어 있기 때문이다. 배열에 실제 데이터를 저장하기 위해 이용할 수 있는 유연성이 감소된다. 2.함수에게 인수로서 배열의 크기를 전달하는 것이다. 함수는 2개의 .. 2006. 4. 6.
포인터 #6 (배열의 첨자) 배열의 첨자에 대한 처리는 포인터에 대한 처리로 대치된다. 예를 들어,배열명 array는 배열에 확보된 메모리 공간의 선두 번지를 의미한다. 그래서, array[4] 와 같은 것은 *(array+4)와 완전히 동일하다. 배열의 이름, 즉 메모리 공간의 선두 번지는 포인터와 동일하게 취급해도 되지만, 한 가지 주의점이 있다. 그것은배열의 이름은 포인터가 아니라는 것이다. 포인터는 주소를 저장하는 '변수'이다. 하지만,배열 이름은 주소 그 자체를 가리키는 상수에 불과하다. 그래서 이름에 따로 공간을 할당하지는 않는다.그래서, array를 포인터로 취급해서 그 값을 변경하려고 하면 에러가 발생한다. 2006. 4. 6.
함수에서 인자를 넘기는 방식 방식의 결정 - 함수를 호출하는 측에서 제공한 인자가 함수로 넘어간 뒤에 그것이 변경될 경우 그 변경의 결과가 함수 호출쪽으로 반영이 되느냐에 따라 결정된다. - C에서의 함수 호출 방식은 '값에 의한 호출' 방식이다. : 함수 내에서 인자에 변형을 가하더라도 호출측의 인자에는 값의 변동이 없다. 인자들을 그래도 함수측으로 똑같이 값을 복하사여 사용한다. 즉, 원본은 놔두고 복사본을 변경하기 때문에 원본은 그대로 보존이 된다. - C에서는 포인터를 이용하여 참조에 의한 호출을 흉내낼 수 있다. 2006. 4. 6.
포인터 #5 (함수포인터) 함수 포인터 - 코드를 가리키는 포인터 예) int sigma(int n){ int r; for(r=0;n>0;n--) r+=n; return r;} 위와 같은 sigma()함수를 가리키는 포인터는 다음과 같이 정의될 수 있다. int (*fptr)(int); 가리킬 함수의 리턴 값의 형과 인자리스트에서 이름을 뺀 데이터형만을 나열한 뒤에 포인터의 이름 앞에 *를 붙이고 괄호를 씌우면 된다. 그러면, fptr에 주소를 대입하려면 어떻게 하여야 할까? fptr은 데이터를 가리키는 포인터가 아니라, 코드를 가리키는 주소이기 때문에 어떤 함수의 시작 주소를 fptr이 가리켜야 한다. ( - 어떤 함수의 시작 주소는 함수명 그 자체이다.) fptr = sigma; /* sigma() 와 같이 쓰면 안됨 */ 이.. 2006. 4. 6.