1. 선언한 것을 기준으로 [], *갯수가 부족 -> address
선언한 것을 기준으로 [], *갯수가 동일 -> value
2. 선언한 것을 기준으로 [], *의 갯수가 1개 부족 -> 1차원 주소
선언한 것을 기준으로 [], *의 갯수가 2개 부족 -> 2차원 주소
선언한 것을 기준으로 [], *의 갯수가 3개 부족 -> 3차원 주소
*3. 주소연산
1차원 주소 + 1 -> 1은 한 요소의 사이즈
2차원 주소 + 1 -> 한 행의 사이즈
3차원 주소 + 1 -> 한 면의 사이즈
int a[2][2]
&a[0][0] + 1 -> a[0][1]
a + 1 -> a[1][0]
포인터 : 메모리의 주소값을 저장하는 변수
배열([])과 포인터(*)는 둘다 주소값을 가지고 있기 때문에 호환 가능함(의미는 바뀌지 않는다.)
void a(int aa[10]){} // aa는 포인터이다. 배열이 아니다.
3차원 배열 주소값 구하기
: 그래프
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
&arr[0][0][0] | &arr[0][0][1] | &arr[0][1][0] | &arr[0][1][1] | &arr[1][0][0] | &arr[1][0][1] | &arr[1][1][0] | &arr[1][1][1] |
arr[0][0] | arr[0][0]+1 | arr[0][1] | arr[0][1]+1 | arr[1][0] | arr[1][0]+1 | arr[1][1] | arr[1][1]+1 |
arr[0] | - | arr[0]+1 | - | arr[1] | - | arr[1]+1 | - |
arr | - | - | - | arr + 1 | - | - | - |
*arr | - | *arr+1 | - | *(arr+1) | - | *(arr+1)+1 | - |
*arr[0] | *arr[0]+1 | *(arr[0]+1) | *(arr[0]+1)+1 | *arr[1] | *arr[1]+1 | *(arr[1]+1) | *(arr[1]+1)+1 |
**arr | **arr+1 | *(*arr+1) | *(*arr+1)+1 | **(arr+1) | **(arr+1)+1 | *(*(a+1)+1) | *(*(a+1)+1)+1 |
: 코드
#include<stdio.h>
int main()
{
int arr[2][2][2] = { 8, 7, 6, 5, 4, 3, 2, 1 };
// 8
printf("【 arr[0][0][0] : 8 = ");
printf("%p 】\n", &arr[0][0][0]);
printf("%p\t", arr[0][0]);
printf("%p\t", arr[0]);
printf("%p\t", arr);
printf("%p\t", *arr);
printf("%p\t", *arr[0]);
printf("%p\t", **arr);
printf("\n\n");
// 7
printf("【 arr[0][0][1] : 7 = ");
printf("%p 】\n", &arr[0][0][1]);
printf("%p\t", arr[0][0] + 1);
printf("%p\t", *arr[0]+1);
printf("%p\t", **arr + 1);
printf("\n\n");
printf("\n\n");
// 6
printf("【 arr[0][1][0] : 6 = ");
printf("%p 】\n", &arr[0][1][0]);
printf("%p\t", arr[0][1]);
printf("%p\t", arr[0] + 1);
printf("%p\t", *arr + 1);
printf("%p\t", *(arr[0]+1));
printf("%p\t", *(*arr+1));
printf("\n\n");
// 5
printf("【 arr[0][1][1] : 5 = ");
printf("%p 】\n", &arr[0][1][1]);
printf("%p\t", arr[0][1] + 1);
printf("%p\t", *(arr[0] + 1) + 1);
printf("%p\t", *(*arr + 1) + 1);
printf("\n\n");
printf("\n\n");
printf("\n\n");
// 4
printf("【 arr[1][0][0] : 4 = ");
printf("%p 】\n", &arr[1][0][0]);
printf("%p\t", arr[1][0]);
printf("%p\t", arr[1]);
printf("%p\t", arr + 1);
printf("%p\t", *(arr + 1));
printf("%p\t", *arr[1]);
printf("%p\t", **(arr + 1));
printf("\n\n");
// 3
printf("【 arr[1][0][1] : 3 = ");
printf("%p 】\n", &arr[1][0][1]);
printf("%p\t", arr[1][0] + 1);
printf("%p\t", *arr[1] + 1);
printf("%p\t", **(arr + 1) + 1);
printf("\n\n");
printf("\n\n");
// 2
printf("【 arr[1][1][0] : 2 = ");
printf("%p 】\n", &arr[1][1][0]);
printf("%p\t", arr[1][1]);
printf("%p\t", arr[1] + 1);
printf("%p\t", *(arr + 1) + 1);
printf("%p\t", *(arr[1] + 1));
printf("%p\t", *(*(arr + 1) + 1));
printf("\n\n");
// 1
printf("【 arr[1][1][1] : 1 = ");
printf("%p 】\n", &arr[1][1][1]);
printf("%p\t", arr[1][1] + 1);
printf("%p\t", *(arr[1] + 1) + 1);
printf("%p\t", *(*(arr + 1) + 1) + 1);
printf("\n\n");
}
반응형
'C언어 > C' 카테고리의 다른 글
C언어 공부 정리6(동적 메모리) (0) | 2020.11.30 |
---|---|
C언어 공부 정리5(구조체) (0) | 2020.11.27 |
C언어 공부 정리4(다차원 포인터) (0) | 2020.11.26 |
C언어 공부정리3(포인터) (0) | 2020.11.25 |
C언어 공부 정리1 (0) | 2020.11.23 |