너무 어려운 포인터... ㅠ.ㅠ
http//pw1.netcom.com/~tjensen/ptr/ch9x.htm 에 있는 문서를 보고 포인
터 공부를 하고있는데요, 아래 소스에서 이해가좀안되네요.
포인터 세개를 어떻게 메모리 할당하는 거나, 그걸 어떻게 이용하는데 되
는지...
또 모르겠는건 아래를 array[ x ][ y ][ z ] 행렬로 볼때 y 가 행이 되
고, z가 열이 되는건가요?
http//pw1.netcom.com/~tjensen/ptr/ch9x.htm
/* Program 9.3 from PTRTUT10.HTM 6/13/97 */
#include
#include
int main(void)
{
int **rptr;
int *aptr;
int *testptr;
int k;
int nrows = 5; /* Both nrows and ncols could be evaluated */
int ncols = 8; /* or read in at run time */
int row, col;
/* we now allocate the memory for the array */
aptr = malloc(nrows * ncols * sizeof(int));
if (aptr == NULL)
{
puts("\nFailure to allocate room for the array");
exit(0);
}
/* next we allocate room for the pointers to the rows */
rptr = malloc(nrows * sizeof(int *));
if (rptr == NULL)
{
puts("\nFailure to allocate room for pointers");
exit(0);
}
/* and now we 'point' the pointers */
for (k = 0; k < nrows; k++)
{
rptr[k] = aptr + (k * ncols);
}
/* Now we illustrate how the row pointers are incremented */
printf("\n\nIllustrating how row pointers are incremented");
printf("\n\nIndex Pointer(hex) Diff.(dec)");
for (row = 0; row < nrows; row++)
{
printf("\n%d %p", row, rptr[row]);
if (row > 0)
printf(" %d",(rptr[row] - rptr[row-1]));
}
printf("\n\nAnd now we print out the array\n");
for (row = 0; row < nrows; row++)
{
for (col = 0; col < ncols; col++)
{
rptr[row][col] = row + col;
printf("%d ", rptr[row][col]);
}
putchar('\n');
}
puts("\n");
/* and here we illustrate that we are, in fact, dealing with
a 2 dimensional array in a contiguous block of memory. */
printf("And now we demonstrate that they are contiguous in
memory\n");
testptr = aptr;
for (row = 0; row < nrows; row++)
{
for (col = 0; col < ncols; col++)
{
printf("%d ", *(testptr++));
}
putchar('\n');
}
return 0;
}
Re^2: 우왕~ 친절한 답변 너무 감사드립니다. (내용無)
`
[답변]너무 어려운 포인터
/* Program 9.3 from PTRTUT10.HTM 6/13/97 */
#include
#include
int main(void)
{
int **rptr; /*실제 메모리(aptr)을 ncols*sizeof(int)크기만
큼씩 가르킴으로서 이차원 배열차럼 보이게 하
는 int **의 변수*/
int *aptr; /*실제 데이타는 여기만 저장됩니다.*/
int *testptr;
int k;
int nrows = 5; /* Both nrows and ncols could be evaluated */
int ncols = 8; /* or read in at run time */
int row, col;
aptr = malloc(nrows * ncols * sizeof(int));
if (aptr == NULL)
{
puts("\nFailure to allocate room for the array");
exit(0);
}
/*실제 연속된 int의 데이타를 위한 메모리를 할당함*/
/* next we allocate room for the pointers to the rows */
rptr = malloc(nrows * sizeof(int *));
if (rptr == NULL)
{
puts("\nFailure to allocate room for pointers");
exit(0);
}
/* 실제 연속된 int의 메모리(aptr)을 sizeof(int)*ncols만큼의
차이만큼씩 가르키게 하는 rptr을 위한 공간을 heap에 할당*/
/* and now we 'point' the pointers */
for (k = 0; k < nrows; k++)
{
rptr[k] = aptr + (k * ncols);
}
/*rptr[k]의 내용(int *)에 sizof(int)*ncols만큼의 차이만큼씩
가르키게 하여 rptr을 이차원 배열처럼 사용하려는 것임*/
/* Now we illustrate how the row pointers are incremented */
printf("\n\nIllustrating how row pointers are incremented");
printf("\n\nIndex Pointer(hex) Diff.(dec)");
for (row = 0; row < nrows; row++)
{
printf("\n%d %p", row, rptr[row]);
if (row > 0)
printf(" %d",(rptr[row] - rptr[row-1]));
}
/*결과를 보시면 아시겠죠? 주소공간의 차이가 sizeof(int)*ncols
즉 4*8 = 32만큼씩 차이나죠? Hex 20 = 32 */
printf("\n\nAnd now we print out the array\n");
for (row = 0; row < nrows; row++)
{
for (col = 0; col < ncols; col++)
{
rptr[row][col] = row + col;
printf("%d ", rptr[row][col]);
}
putchar('\n');
}
/* rptr[row]의 하나하나가 aptr의 연속할당된 메모리를
sizeof(int)*ncols 만큼의 차이를 두고 가르키고 있고
rptr[row][col]은 *(rptr[row] + col)과 같으므로 int
하나 하나의 내용을 가르키게 되겠죠? */
puts("\n");
/* and here we illustrate that we are, in fact, dealing with
a 2 dimensional array in a contiguous block of memory. */
printf("And now we demonstrate that they are contiguous in
memory\n");
testptr = aptr;
for (row = 0; row < nrows; row++)
{
for (col = 0; col < ncols; col++)
{
printf("%d ", *(testptr++));
}
putchar('\n');
}
/*원래 주소공간이 연속이므로(aprt)에서 연속적인 연산을
통하여 그 내용을 뽑아낼수 있음은 당연! 하죠?*/
/*이 프로그램은 할당된 메모리를 해제하는 다음과 같은 루틴을
빼먹음으로서 치명적인 버그를 안고 있군요.*/
free(rptr); <== 매우 중요
free(aptr); <== 매우 중요
/*원칙적으로 순서를 바꾸면 않 됩니다. 바꾸면 rptr이 잠시잠깐
이라도 의미없는 heap영역을 가르키고 있게 되기 때문이죠*/
return 0;
}
메모리 구조는 이렇습니다.
rptr-> rptr[0] --> aptr[0]...aptr[7]
rptr[1] --> aptr[8]...aprt[15]
rptr[2] --> aptr[16]...aptr[23]
rptr[3] --> aptr[24]...aptr[31]
rptr[4] --> aptr[32]...aptr[39]
aptr-> aptr[0]....aptr[39]
참고로 aptr, rptr은 메모리에서 함수의 데이타 영역에 있고,
aptr[0]..[39], rptr[0]..[4]는 heap영역에 위치하는 것도 알
아두셔야겠죠?
댓글 달기