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 //가능~
댓글 없음:
댓글 쓰기