너무 어려운 포인터... ㅠ.ㅠ

익명 사용자의 이미지

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;
}

익명 사용자의 이미지

`

익명 사용자의 이미지

/* 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영역에 위치하는 것도 알
아두셔야겠죠?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.