- C코드 내에서 사용되는 모든 상수나 변수는 차원이 부여되어있다. (최저차원 : 0차원)
- 상수나 변수의 차원은 차원조절 연산자에 의해서 차원이 변경될 수 있다. ( ↑ ↓ )
- Lvalue와 Rvalue는 차원이 같아야 대입연산이 가능하다.
(주소상수는 자동형변환이 불가능 하다)
연산자 |
선언문 |
일반 실행문 |
비 고 |
*, [] |
차원 올림 |
차원 내림 |
중복사용 가능 |
& |
사용불가 |
차원 올림 |
중복사용 불가능 |
(type) |
사용불가 |
여러차원 올리고 내리기 가능 |
피연산자의 type과 차원 고려x |
-> |
사용불가 |
차원 내림( * + . 의개념) |
중복사용 불가능 |
만약 int a[3][4]; 라는 2차원 배열이 있다고 가정하자.
배열 a를 받을 함수의 매개변수의 형태로 알맞는 것은 어떤 형태일까?
ex) void sub( ?? )
가장먼저 2차원배열이니 2차원형태의 형태를 맞춰주어야겠다.
그다음으로 알아야할 것은,
n차원 배열의 시작주소는 그 배열의 가장 큰 구성요소의 한 차원 높은 주소이다. 라는 사실이다.
그러면 방법1 int **p 라고 하면 되는걸까? ( X )
int * *p 라고 조금 떨어져서 구분지어 생각하면 좋다. 위의 방법1은 차원맞 맞춰준거지
결국 int *라는 곳을 가리키는 포인터라는 뜻이 되어버린다.
방법2 int *p[4] 를 해석해보자.
연산자 우선순위에 의하면 1번째로 해석될곳은 p[4] 부분이 된다.
그러면 int a[4]의 뜻과 비교해보자.
a라는 녀석은 int라는 요소를 4개가진(4개의방) 녀석이 된다.
이와 같이 위의 경우를 해석해보면 p[4]도 int *라는 포인터를 4개가진 녀석이 되어버린다. ( X )
방법3 int (*p)[4] 를 다시 해석해보자. 연산자 우선순위에의해 처음으로 해석될 곳은 (*p)이다.
(연산자 우선순위에서 보면 ( ) 와 [ ] 의 우선순위가 1순위로 같지만 -> 방향의 형태이다.)
나는 포인터라고 먼저 명시를 해주는 것이다.
그러면 이 녀석은 int [4]를 가리키는 포인터가 되어버린다.
이는 int[4]보다 1차원 높은 구성요소이면서,
주소를 나타내 줄수 있는 포인터이므로 맞는 표현이 된다. ( O )
cf) int p[4](*)는 p[4]가 먼저 해석되므로 배열이다. ( X )
마지막으로 방법4 int p[3][4] 를 해석해보자.
parameter 자리에 선언된 배열은 실제 배열로 잡히지 않고,
그렇게 생긴 배열을 가리키는 포인터변수로 잡히기에 가능하다. ( O )
위와같이 인식된 포인터의 경우 포인터가 그 배열의 첫 번방을 가리키는 주소를 나타내기에,
마치 자신이 그 배열의 배열명인 것처럼 쓰일 수 있다.
결론 : 2차원배열의 파라미터형태는 방법 3과 4의 형태로 쓰면되며,
배열의 이름은 곧 그 배열의 시작주소 상수이므로....
포인터 하나로 여러방을 가리킬 수 있다는 결론에 도달 할 수 있다. p[i][j]와 같은 꼴로...
- a[i] == *( a+i )
- a[i][j] == *( *( a+i ) + j )
- a[i][j][k] == *(*(*( a+i ) +j ) +k )
면[i] 행[j] 열[k]
- 배열명을 스고 (딱 1회만)
- 첨자를 더하고
- ( ) 로 묶고
- * 연산자를 붙인다.
- ary[3][4]에서 ary[2][3] = 77; 과 같은 표현을 포인터로 나타내면?
-> *(*(ary+2)+3) = 77;
행 열
-> 풀어서 내부결과를 나타내보면
-> ary의 시작주소가 100번지라고 가정하면
-> 100번지(int(*)[4] : 2차원) + 2(행첨자) * sizeof(int[4]) = 132번지 (int(*)[4] : 2차원)
-> 실행문이므로 * 에 의해 차원이 내려가면 int * : 1차원
-> 132(int *) + 3(열첨자) * sizeof(int) = 144번지 (int *)
-> 실행문이므로 * 에 의해 차원이 내려가며 int형태가되고 int형태인 77 값이 들어가게 되는 원리이다.
- int **p1; : p1은 1차원 int형 포인터를 가리키는 포인터
- int *p2[5]; : p2는 요소가 5개인 배열로서 각 배열의 요소는 int형 포인터이다. ( 포인터배열 )
- int (*p3)[5]; : p3은 포인터로서 열이 5개인 2차원 배열을 가리키는 포인터 변수, 그 배열의 각 요소는 모두 int형 이다. ( 배열 포인터 )