C, C++

포인터와 배열

SuuuuuuuL 2018. 12. 13. 11:46

배열은 배열 자체로 주소값 


배열명 = 배열의 첫번째 방 주소값 

array = &array[0]

*array = array[0]


char str [] = "korea"; 

"korea" 도 주소상수로 취급됨!


char*p = str; 이지만...

char* p = "korea"; 도 가능함 


&array 는 엄밀하게는 2차원이지만 출력하면 &array[0]의 값이 출력됨

그러나 대표하는 값이 다름 전자는 배열 전체의 대표주소값이고 후자는 배열의 첫번째 값의 주소값임


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

    

    //배열의 포인터 표현 방식이 가능함!

    //printf("%d, %d\n", *iarr, iarr[0]); // iarr = &iarr[0], *iarr = iarr[0]

    // 주소연산은 +,- 밖에 안됨! ==> +1 자기자신의 (byte) 만큼 더해라 라는 ...

    

    for(int i = 0; i < 5; i++)

    {

        printf("%d \n", *(iarr+i)); /// 포인터를 이용한 배열표현

    }

    printf("%d, %d \n", &iarr, iarr); // 배열 자체(전체 사이즈의 주소값), 첫번째 배열의 주소값을 나타냄

                                                         (= 출력되는 주소값은 동일)


함수를 이용한 배열의 출력시 주의할 점 

*배열은 매개변수로 전달되지 않음! 그리고 배열은 주소값이라서 결국 포인터 변수(=주소값)으로 받게 된다..

void output(int* iary, int len){
    printf("size of iray: %d\n", sizeof(iary)); //포인터가 가지는 사이즈는 unsigned int라서 4byte 고정임..
    printf("size of *iray: %d\n", sizeof(*iary)); // 포인터가 가리키는 값의 사이즈
// 포인터가 가지는 주소값을 따라가서 나오는 값을 출력하라고 하니까 int가 4byte 라서 4가 출력.

// c에서는 꼭 배열의 크기도 같이 보내야함 ...함수 안에서 배열의 크기를 찾아내는것이 어려움!
    for(int i = -2; i < len-2; i++){ // 자바와 다르게 배열인덱스를 -값을 주는것이 가능
        printf("%d\n", *(iary+i));
    }
}
int main(int argc, char const *argv[])
{
    int iary[] = {1,2,3,4,5};
int len= sizeof(iary)/sizeof(iary[0]);

    output(&iary[2], len); // 2번째 방을 보냈으니 출력을 위해선 그만큼 빼줘야...
    //output2(iary2);