본문 바로가기

dev, tech224

포인터 #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.
포인터 #4 (void 포인터) void 포인터 - 포인터의 두 가지 요소 중, 둘째 요소인 가리키는 데이터형이 정해지지 않은 포인터를 의미한다. void포인터의 정의는 가리키는 데이터형이 없으므로 데이터형 자리에 void라는 예약어룰 기술한다. 예) void *vptr; - 특징 : 1. 역참조 연산자(* : 포인터가 가리키는 곳의 내용을 읽어냄)를 사용하지 못한다는 것이다. (참조하려면 가리키는 데이터형을 알아야 적절하게 해석을 한다.) 하지만, 형변환 연산자 (casting operator)를 이용하여 다른 형의 포인터로 강제 형변환을 하면 참조가 가능하다. 예) int i; i = *vptr; // 잘못된 표현 . vptr은 형이 정해지지 않았기 때문이다. i = *(int*)vptr; // vptr 을 (int *)연산을 이용.. 2006. 4. 6.