일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- docker
- github
- dart 언어
- Unity
- 깃
- Flutter
- C언어 포인터
- HTML
- Houdini
- c언어
- jupyter
- c# winform
- 도커
- Data Structure
- gitlab
- C++
- 유니티
- C# delegate
- Python
- c# 추상 클래스
- c# 윈폼
- 플러터
- 다트 언어
- 포인터
- vim
- jupyter lab
- Algorithm
- 구조체
- git
- c#
- Today
- Total
nomad-programmer
[Programming/C] 다차원 배열 주소의 의미 본문
c_arr 변수의 메모리 주소가 12ff7c 라고 가정한다.
#include <stdio.h>
void main() {
char c_arr[2][2] = {'A', 'B', 'C', 'D'};
printf("%x %x %x %x\n",
&c_arr[0][0], c_arr, c_arr[0], c_arr[1]);
printf("%x %x %x %x\n",
&c_arr[0][0]+1, c_arr+1, c_arr[0]+1, c_arr[1]+1);
}
// 결과
/*
12ff7c 12ff7c 12ff7c 12ff7e
12ff7d 12ff7e 12ff7d 12ff7f
*/
&c_arr[0][0]는 char형 1바이트의 주소를 의미하며 여기에 +1을 한 것은 1바이트의 주소를 덧셈하라는 의미이다.
c_arr은 char형 배열 2*2의 시작 주소를 의미하며 +1을 한 것은 열의 바이트수인 2바이트(char형 2개[2])의 주소를 건너뛰라는 의미이다.
c_arr[0]는 0행의 시작 주소를 의미하며 1차원 char형 주소의 의미로 +1을 한 것은 char형 1바이트의 주소를 건너뛰라는 의미이다.
또 c_arr은 char형 2차원 배열이므로 char형의 2차원 의미를 갖고 c_arr[0], c_arr[1], &c_arr[0][0]는 1차원의 의미를 갖는다.
각 주소는 * 연산를 붙여 값에 접근하거나 차원을 한 단계 낮추는 데 사용한다.
예를 들어 1차원 주소에 *연산자를 붙이면 값이 되지만 2차원 주소에 *연산자를 붙이면 1차원 주소가 되고, 3차원 주소에 *연산자를 붙이면 2차원 주소가 된다.
#include <stdio.h>
void main() {
char c_arr[2][2] = {'A', 'B', 'C', 'D'};
printf("%x %x %x %x\n", c_arr, *c_arr, **c_arr);
printf("%x %x %x %x\n", c_arr, c_arr[0], c_arr[0][0]);
}
// 결과
/*
12ff7c 12ff7c 41
12ff7c 12ff7c 41
*/
두 문장의 코드는 같다. c_arr은 2차원 주소 12ff7c를, *c_arr은 1차원 주소 12ff7c를, **c_arr은 메모리 자체(문자 'A')를 의미한다.
*c_arr은 1차원 주소를 의미하는데, c_arr이 2차원 주소이므로 * 연산자를 붙여 1차원 주소가 된다. 또 **c_arr은 char형 1바이트를 의미하는데, *c_arr이 1차원 char형 주소를 의미하기 때문이다.
3차원 배열
#include <stdio.h>
int main() {
char c_arr[2][2][3] = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'
};
printf("%x %x %x %x\n",
c_arr, c_arr[0], c_arr[0][0], c_arr[0][0][0]);
printf("%x %x %x %x\n",
c_arr + 1, c_arr[0] + 1, c_arr[0][0] + 1, c_arr[0][0][0] + 1);
printf("%x %x %x %x\n",
c_arr + 1, *c_arr + 1, **c_arr + 1, ***c_arr + 1);
return 0;
}
// 결과
/*
ddfb70 ddfb70 ddfb70 41
ddfb76 ddfb73 ddfb71 42
ddfb76 ddfb73 ddfb71 42
*/
c_arr은 3차원 char형 배열의 시작 주소이다. +1은 행X열([2][3], 6바이트)을 증가시킨 주소가 된다.
c_arr[0]에 +1을 한 것은 열([3], 3바이트)을 증가시킨 주소가 된다.
c_arr[0][0]에 +1을 한 것은 char형 1바이트를 증가시킨 주소가 된다.
c_arr[0][0][0]는 문자 'A' (0x41)에 1을 증가시켜 문자 'B' (0x42)가 된다.
'Programming > C' 카테고리의 다른 글
[Programming/C] 문자 코드 (0) | 2021.01.15 |
---|---|
[Programming/C] 배열 요소 접근 (0) | 2020.06.22 |
[Programming/C] 상수 주소를 사용한 배열 요소 접근 (0) | 2020.06.21 |
[Programming/C] 주소와 메모리 (0) | 2020.06.21 |
[Programming/C] 주소의 형 변환 (0) | 2020.06.21 |