#include <stdio.h>
//배열의 이름은 주소값이다.
//단, 상수이다.
void exam1()
{
int arr[3] = { 1, 2, 3 };
int arr1[3] = { 11, 22, 33 };
// arr = arr1; // 배열의 이름을 L-value에 사용? 불가능...
// 배열의 이름은 저장공간을 가리키는 개념이 아니라
// 배열 구조 전체의 주소를 가리키는 개념이다.
//==============================================================
*arr = arr1[0];// *arr = 11; // *arr은 R-value에 사용?
*(arr + 1) = 22; //???
// (*arr) + 1 = ;// 절대 불가능 (*arr) + 1 의 결과는 숫자이기때문
}
//배열 포인터
//배열의 주소를 포인터 변수에 대입하면
//배열의 이름을 이용한 연산과 포인터변수를 이용한 연산의 결과는 동일하다
void exam2()
{
int arr[5] = { 1, 2, 3, 4, 5 };
int *parr = arr;
printf("%d : %d\n", arr, parr); //952
// arr를 +1 이동한 역참조
printf("%d : %d\n", arr[1], parr[1]); //2,2
printf("%d : %d\n", *(arr + 1), *(parr + 1)); //2,2
}
//2차원 배열과 포인터
void exam3()
{
int arr[3][4] = { { 1, 2, 3, 4 }, //924
{ 5, 6, 7, 8 }, //940
{ 9, 10, 11, 12 } }; //956
printf("%d\n", arr); //924(2)
printf("%d\n", arr + 1); //940(2)
printf("%d\n", (*arr) + 1); //928(1)
printf("%d\n", arr[0] + 1); //928(1)
printf("%d\n", arr[0][0] + 1); // 1 + 1 = 2(산술연산)
printf("%d\n", *(arr[1] - 3)); // 1) arr + 1 이동한 역참조 : 940
// 2) -3 이동 : 928
// 3) 역참조 :2(0)
printf("%d\n", arr[1][-3]); // 위 코드와 동일
}
//2차원 배열과 포인터
void exam4()
{
int arr[3][4] = { { 1, 2, 3, 4 }, //924
{ 5, 6, 7, 8 }, //940
{ 9, 10, 11, 12 } }; //956
//열의 크기가 다르기 때문에 잘못된 연산이다...
// int **pp = arr; // int 2차 = int 2차 ** = (*)[4]
// printf("%d\n", pp + 1); //4byte 이동
//포인터 변수 선언시 열의 크기를 지정해야 한다.
int (*p)[4] = arr; // (*)[4] = (*)[4]
// p 몇차원포인터일까? 2차원....
printf("%d : %d : %d\n", p, *p, **p); //924,924,1
printf("%d : %d : %d\n", **(p + 1), p[1][0], p[2][-4]);
}
int main(void)
{
int *pt;
int(*pa)[3]; //포인터,열의 크기가 3인 2차원 배열 주소
int arr1[2][3];
int arr2[3][2];
int **p2; // int ***p3,
exam4();
return 0;
}
댓글