본문으로 바로가기

[C언어] 배열과 포인터의 관계

category C 2014. 6. 3. 14:50

1차원 배열과 포인터의 관계

배열을 포인터처럼 쓸 수 있고 포인터를 또한 배열 처럼 쓸 수 있다.

char a[4] = {'N', 'e', 'o'}; //char a[4] = "Neo";

// 주소값에 대한 표현

&a[n] = a + n

// 주소값의 내용물에 대한 표현

a[n] = *(a + n) = *(&a[n])

 

 

 

a

&a[0]

 a+1

&a[1]

a+2 

&a[2]

a+3

&a[3]

 

 

 

 

1000

1001

1002

1003

 

 

 

 

N

e

o

\0

 

 

 

 

a[0]

*(a)

a[1]

*(a+1)

a[2]

*(a+2)

a[3]

*(a+3)

 

 


예>

#include <stdio.h>
void main()
{
    // 배열과 포인터에 대한 관계
    char name[10] = "Neo";
    char* pname = name;

    printf("name: %s pname: %s\n", name, pname);
    *(pname) = 'x';
    *(pname+1) = 'y';
    *(pname+2) = 'z';
    printf("name: %s pname: %s\n", name, pname);
    *(name) = 'B';
    *(name+1) = 'o';
    *(name+2) = 'b';
    printf("name: %s pname: %s\n", name, pname);
    name[0] = 'J';
    name[1] = 'o';
    name[2] = 'e';
    printf("name: %s pname: %s\n", name, pname);
    pname[0] = 'M';
    pname[1] = 'a';
    pname[2] = 'x';
    printf("name: %s pname: %s\n", name, pname);
    // 결론 : a[n] = *(a + n)

}

 

2차원 배열과 포인터의 관계

    int c[2][3] = { 1, 2, 3, 4, 5, 6};

 

&c[n] = c + n

c[n] = *(c + n)

&c[n][m] = *(c + n) + m     = c[n]+m

c[n][m]   = *(*(c + n) + m) = *(c[n]+m)

 

3000

c

&c[0]

*(c+0)

c[0]

&c[0][0]

3004

 

 

*(c+0)+1

c[0]+1

&c[0][1]

3008

 

 

*(c+0)+2 

c[0]+2 

&c[0][2]

3012

c+1

&c[1]

*(c+1)

c[1]

&c[1][0]

3016

 

 

*(c+1)+1

c[1]+1

&c[1][1]

3020

 

 

*(c+1)+2

c[1]+2 

&c[1][2]

1

2

3

4

5

6

c[0][0]

*c[0]

*(*(c+0)+0)

c[0][1]

*(c[0]+1)

*(*(c+0)+1)

c[0][2]

*(c[0]+2)

*(*(c+0)+2)

c[1][0]

*c[1]

*(*(c+1)+0)

c[1][1]

*(c[1]+1)

*(*(c+1)+1)

c[1][2]

*(c[1]+2)

*(*(c+1)+2)

c+1 => c+1*sizeof(int)*3

c[0]+1 => c[0]+1*sizeof(int)

 

c[i][j] == *(*(c + i) + j)

 

예제1>

#include <stdio.h>
void main()
{
    int c[2][3] = {1, 2, 3, 4, 5, 6};
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {             // 결론 : a[n] = *(a + n)
             printf("%p:%p:%p[%d][%d]=(%d:%d:%d) \n",
                      &c[i][j], *(c + i) + j, c[i]+j,  // 주소값 똑같다.
                       i, j,
                     c[i][j], *(*(c + i) + j), *(c[i]+j) ); // 내용물 똑같다.
        }
        printf("\n");
    }
}

 

포인터 배열(Array of Pointer) : 배열이며, 해당되는 자료형의 포인터를 저장하는 연속된 공간의 집합이다.

#include <stdio.h>
void main()
{
    char *a = "123567890";
    char *b = "asdf";
    char *c = "The Calling";
    char *d = "Are you ready to change your life?";
    char* p[4] = {a, b, c, d};
    for (int i = 0; i < 4; ++i)
        printf("p[%d]:%p = %s\n", i, p[i], p[i]);
}
<결과>
p[0]:00406144 = 123567890
p[1]:0040613C = asdf
p[2]:00406130 = The Calling
p[3]:0040610C = Are you ready to change your life?
Press any key to continue


 

배열 포인터(Pointer to Array) : 포인터이며, 다차원 배열의 전체 시작 주소를 저장한다.

 

char name[2][3] = {"ab", "xy"};

char (*ppName)[3] = name; // sizeof(char) * 3 단위로 계산된다.

ppName+1 오른쪽과 같이 해석된다. ppName+1*sizeof(char) * 3 == ppName + 3

 

 

int school[2][3][4];
int (*pSchool)[3][4] = school; // sizeof(int) * 4 * 3 단위로 계산된다.

 

예제2>

#include <stdio.h>
void main()
{
    char name[2][3] = {{'a','b'}, {'x','y'}};
    char (*ppName)[3] = name;
    char *pName0 =  *(ppName+0); //ppName[0]
    char *pName1 =  *(ppName+1); //ppName[1]

    // ppName[0] == *ppName
    // ppName[1] == *(ppName+1)

    printf("ppName[0] = %s\n",ppName[0]);
    printf("ppName[1] = %s\n",ppName[1]);
    printf("ppName = %s\n",*ppName); 
    printf("ppName+1 = %s\n",*(ppName+1));
    printf("pName0 = %s\n",pName0);
    printf("pName1 = %s\n",pName1);


    // 결과는 똑같지만 ppName != ppName[0] 
    // 결과는 똑같지만 ppName != *(ppName + 0)

    printf("ppName = %s\n",ppName);
    printf("ppName+1 = %s\n",ppName+1);
}

 

함수 Parameter 를 배열로 설정하기

2차원 배열

#include <stdio.h>

//void SetMatrix(float m[][4], float fValue , int iCount)

void SetMatrix(float (*m)[4], float fValue , int iCount)
{
    for (int i = 0; i < iCount; ++i)
    {
        *(*m + i) = fValue;
    }
}

void main()
{
    float matWorld[4][4]= 
    {  1.0f,  2.0f,  3.0f,  4.0f,
       5.0f,  6.0f,  7.0f,  8.0f,
       9.0f, 10.0f, 11.0f, 12.0f, 
       13.0f, 14.0f, 15.0f, 16.0f
    };
    SetMatrix(matWorld, 0.0f, 8);
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)

        {
            printf("%2.1f ", matWorld[i][j]);

        }
        printf("\n");
    }
    printf("%d\n", sizeof(matWorld));
}