개요
프로그래밍 언어 : C언어
과제 수행 날짜 : 2020.09.25
과제 개요 : 2차원 배열의 주소와 상대 주소를 정리
코드
#include <stdio.h>
int i[3][4] = {100, 200, 300, 400, 500, 600, };
int main()
{
printf("%p\n", i);
printf("%p %p %p\n", i+1, &i, &i + 1);
printf("%p %p %p\n", i[0], i[1], i[2]);
printf("%p %p %p\n", i[0] + 1, i[1] + 1, i[2] + 1);
printf("%p %p %p\n", i[0] + 2, i[1] + 2, i[2] + 2);
printf("%p %p %p\n", &i[0], &i[1], &i[2]);
printf("%p %p %p\n", &i[0] + 1, &i[1] + 1, &i[2] + 1);
printf("%p %p %p\n", &i[0][0], &i[1][0], &i[2][0]);
printf("%p %p %p\n", i[0][0], i[1][0], i[2][0]);
}
결과
- 실제주소와 상대주소 ( i의 실제주소는 00AFA034, 상대주소는 0)
변수 | 실제주소 | 상대주소 | 변수 | 실제주소 | 상대주소 | 변수 | 실제주소 | 상대주소 |
i+1 | 00AFA044 | 16 | &i | 00AFA34 | 0 | &i+1 | 00AFA064 | 48 |
i[0] | 00AFA034 | 0 | i[1] | 00AFA044 | 16 | i[2] | 00AFA054 | 32 |
i[0]+1 | 00AFA038 | 4 | i[1]+1 | 00AFA048 | 20 | i[2]+1 | 00AFA058 | 36 |
i[0]+2 | 00AFA03C | 8 | i[1]+2 | 00AFA04C | 24 | i[2]+2 | 00AFA05C | 40 |
&i[0] | 00AFA034 | 0 | &i[1] | 00AFA044 | 16 | &i[2] | 00AFA054 | 32 |
&i[0]+1 | 00AFA044 | 16 | &i[1]+1 | 00AFA054 | 32 | &i[2]+1 | 00AFA064 | 48 |
&i[0][0] | 00AFA034 | 0 | &i[1][0] | 00AFA044 | 16 | &i[2][0] | 00AFA054 | 32 |
i[0][0] | 0x64 | 100 | i[1][0] | 0x1F4 | 500 | i[2][0] | 0 | 0 |
설명
전역변수로 만든 배열의 주소를 살펴보면, 일단 i와 &i, i[0], &i[0], &i[0][0]의 주소가 모두 같음을 알 수 있다. 하지만 i + 1을 하면 16이 증가하는 것으로 보아 다음 행을 가리키고, &i + 1을 하면 48이 증가하는 것으로 보아 다음 배열을 가리킴을 알 수 있다.(배열 전체를 건너 뜀). 또 i[0] + 1을 하면 4가 증가하므로 첫 번째 행에서 다음 요소를 가리키고, i[0] + 2를 하면 8이 증가하므로 다다음 요소를 가리킴을 알 수 있다. 또 &i[1][0]과 &i[2][0]은 각각 두 번째, 세 번째 행의 처음에 있는 int의 주소를 가리킨다. 마지막으로 i[0][0]과 같이 표현하면 배열의 해당 인덱스에 있는 값이 출력된다. i[2][0]에는 초기값을 입력하지 않았으므로 0이 출력된다. 2차원 배열에서 i[0][0]과 같은 형태로 입력하지 않으면 모두 주소 값을 가진다.
'프로젝트 & 과제 > 3학년' 카테고리의 다른 글
[C언어] 2차원 배열의 합 (0) | 2022.01.29 |
---|---|
[C언어] 홀짝 구분 (0) | 2022.01.28 |
[C언어] 비트 연산 (0) | 2022.01.26 |
[C언어] 출력 프로그램의 변수공간 (0) | 2022.01.25 |
[C언어] 한글 / 영어 / 숫자 / 특수문자 (0) | 2022.01.24 |