본문 바로가기
정상을향해/Languages

[C] 포인터 : 배열명

by 사이테일 2011. 4. 16.

배열명은 그 자체가 주소를 의미한다.


     int temp[3] = {1, 2, 3};
     int *temp_p;



위와 같은 정의가 있을 때,


     for(i = 0; i < 3; i++)
          printf("%d", *(temp + i));     // 1번식

     for(i = 0; i <3; i++)
          printf("%d", *temp++);     // 2번식

1번식은 문제없이 실행되지만,

2번식은 에러를 발생한다.


배열명 자체에 주소 값 할당은 이루어질 수 없기 때문이다.


배열명은 포인터 변수가 아니라 배열명 자체일 뿐이다.




다음의 코드를 분석해보자.

 #include <stdio.h>

  int main()
  {
     int temp[3][2] = {{5, 2}, {4, 1}, {6, 7}};    // 3X2 배열 초기화
     int (*temp_p)[2];

     int i, j;

     temp_p = temp;        // 포인터 할당


     for(i = 0; i < 3; i++)        // 포인터 연산만 사용
         for(j = 0; j < 2; j++)
             printf("[%d][%d] %d  ", i, j, *(*(temp_p + i) +j));

     printf("\n");

     for(i = 0; i < 3; i++)        // 부분 첨자 사용
         for(j = 0; j < 2; j++)
             printf("[%d][%d] %d  ", i, j, *(temp_p[i] + j));

     printf("\n");

     for(i = 0; i < 3; i++)        // 첨자만 사용
         for(j = 0; j < 2; j++)
             printf("[%d][%d] %d  ", i, j, temp_p[i][j]);

     printf("\n");

     for(i = 0; i < 3; i++)        // 배열 사용
         for(j = 0; j < 2; j++)
             printf("[%d][%d] %d  ", i, j, temp[i][j]);

     printf("\n");
    
     return 0;
  }





'정상을향해 > Languages' 카테고리의 다른 글

상속 (Inheritance)  (0) 2013.11.11
얕은복사와 깊은복사  (0) 2013.11.11
멤버 이니셜라이저를 이용한 멤버 초기화  (0) 2013.11.11
C++에서의 파일분할  (7) 2013.11.10
참조자(Reference)와 함수  (0) 2013.11.10
[C] 포인터 : *의 의미  (0) 2011.04.16