포인터의 호환성(Compatibility)
대부분 문법적으로는 가능하지만 가급적 사용하지 않기를 권장하는 내용들이 대부분이다.
int n = 5;
double x;
x = n; // no error(promotion)
int* p1 = &n;
double* pd = &x;
pd = p1; // warning
int변수의 값을 doulble변수에 할당하는건 문제가 안된다. double이 더 큰 자료형이라서 이경우 promotion이라고 함.
근데 아래처럼 int 포인터 변수를 double포인터 변수에 할당할 순 없다. 오류가 난다.
근데 내가 사용하는 비주얼스튜디오 버전에선 오류가 안난다. 패치된듯. 홍정모님은 정 저렇게 사용하고 싶다면 p1을 double로 캐스팅 하라고 하심.
pd = (double*)p1;
하지만 정말 권장하지 않는다. 포인터끼리 캐스팅해야한다면 주석을 꼭 달길 바람.
그리고 여담인데 실무에서 포인터를 복잡하게 쓸 일이 없다. 그리고 안그러는게 훨씬 낫고, 그래야 한다면 최대한 회피하라. 인간이 직관적으로 이해할 수 있게 잘 짜는게 좋은 코딩이다.
int* pt;
int(*pa)[3];
int ar1[2][3] = { 3, };
int ar2[3][2] = { 7, };
int** p2;
pt = &ar1[0][0];
for (int i = 0; i < 6; i++)
printf("%d ", *(pt+i));
그리고 다시 설명하지만, 1차원 배열로 다차원배열에 저장된 원소 모두 접근 가능하다. 메모리가 그렇게 되어있기 때문에.
pt = ar1; //error
ar1은 2차원배열이기 때문에 그냥 포인터에는 담을 수 없다고 함? 왜?
근데 실제로 빌드해보면 된다. 버전이 다른듯