2015년 7월 20일 월요일

포인터와 배열

 포인터 쉽게 잘 이해하고, 잘 쓰고 있다고 생각했건만. 잘 이해를 못했던 거 같아서 다시 정리 해본다.
 int a[4] = {1,2,3,4};
 int *p = a;
 // 이게 가능한 이유는 배열이름이 일반적으로 배열의 첫번째 원소의 시작주소로 해석되기 때문 -> decay라는 개념..
// 근데 예외는 있다.. sizeof , & 

 sizeof(a) ; // 16바이트
 sizeof(p); //8바이트(64비트 운영체제일경우)
//위처럼 사이즈가 다르게 나온 이유는 sizeof가 decay의 예외이기 때문
//sizeof(&a)와 같다.

그렇다면 a, &a는 다르다는것..
a는 int 배열의 첫번째 원소의 시작주소이고
&a는 int 4개 배열의 주소 이다.


int a[4] = {1,2,3,4};
int (*p)[4] = &a;
//&a를 받으려면 int 4개의 배열을 가르키는 포인터로 해야한다.


//2차원 배열을 받는다면 아래와 같이 받아야 하겠다..
        int a[2][2] = {{1,2},{3,4}};
        int (*p)[2]= a;  //int 배열이 2개인 포인터


// 만약 아래처럼 받았다면
      int *p  = a; 
     
 int p[1][1]=10;  //이게 가능한가?

//위 대입부분을 풀어쓰면
*(*(p+1)+1)  p의 주소값을 1000이라하면
*(*(1000+1)+1)
*(*1004+1)
*(2+1) //에러


//만약 아래처럼 받았다면
int **p =a;
int p[1][1]=10; //이게 가능한가?

*(*(p+1)+1)
*(*(1000+1)+1)
*(*1004+1)
*(2+1) //에러


int (*p)[2]= a;  //int 배열이 2개인 포인터
 int p[1][1]=10;  //이게 가능한가?

*(*(p+1)+1)
*(*(1000+1)+1)
*(*1008+1)  //1008의 번지의 주소값은 a[1]
*(1008+1)
*1012 = 10 //가능~



댓글 없음:

댓글 쓰기