61.12 심사문제 질문
, flowithego 님이 작성아래 코드 내용중에 보면 float *stats; 로 선언되어 있는 stats 포인터 변수가
밑에 가면 stats[0], stats[1] 처럼 쓰이면서 값을 할당받는데 배열의 주소를 할당받은게 아닌데 어떻게 인덱스번호가 쓰이는건가요?
int main()
{
char *name;
float *stats;
name = allocMemory();
strcpy(name, "Mercury");
printf("%s\n", name);
free(name);
stats = allocMemory();
stats[0] = 87.969f;
stats[1] = 115.8776f;
printf("%f %f\n", stats[0], stats[1]);
free(stats);
return 0;
}
Re: 61.12 심사문제 질문
, 도장_ 관리자님이 작성UNIT 59.2를 보면
numPtrB = numPtrA + 1; // 포인터 연산. numPtrA + 4바이트
numPtrC = numPtrA + 2; // 포인터 연산. numPtrA + 8바이트
이와 같은 관계가 성립합니다.
printf("%d\n", *numPtrB); // 22: 역참조로 값을 가져옴, numArr[1]과 같음
printf("%d\n", *numPtrC); // 33: 역참조로 값을 가져옴, numArr[2]와 같음
배열은 동적으로 할당하지 못합니다. 동적 할당인 포인터를 사용해서 배열에 사용할 메모리를 할당합니다. 포인터로 할당한 메모리 공간을 배열 첨자로 접근하는 방식이나 포인터 연산으로 접근하는 방식이나 같습니다.
ptr[1]로 접근하거나 *(ptr + 1)로 접근하거나 같습니다.
문제에서 stats[1]이나 *(stats + 1)이라 같습니다.
문제에서
*(stats+1) = 115.8776f;
이렇게 바꿔도 잘 동작합니다.
*(1+stats) = 115.8776f;
이를 응용해서 가끔 초보자를 골탕먹이려는 사람들은 의도적으로 다음과 같은 코드를 작성하기도 합니다.
1[stats] = 115.8776f;
마찬가지로 stats[0]은 0[stats]로 써도 동작합니다.
첨자 연산자 [ ]는 포인터 연산의 편리한 표기법으로 이해하면 됩니다.