int ary[3][4]
다음은 자료형이 int [4]이고 논리적으로 세 개의 일차원 배열을 요소를 갖는 2차원 배열이다. 여기에서 일곱 번째 물리적인 요소의 값에 접근하려면 먼저 포인터 연산을 할 것이기 때문에 정수 연산에 대해 변화하는 주소를 이해해야 한다. ary는 배열의 이름이자 이차원 배열의 첫 번째 부분 배열(ary[0])의 주소를 말한다. 그러므로 ary의 시작 주소를 100이라 가정하고, ary + 1처럼 정수 연산을 하게 되면
ary + 1 == ary + (1 * sizeof(ary[0])) == 100 + 16 == 116
이런 식으로 된다. 여기서 2를 더하면 바로 일곱 번째 요소에 접근할 수 있다고 생각할 수 있지만 (ary + 1) + 2로 하면 같은 원리로 ary + 3이 되어버려서 할당 받지 않은 메모리에 접근하게 된다. 그래서 간접참조 연산자를 사용하여 *(ary + 1)로 두 번째 일차원 배열의 주소를 구해야 한다. 이후 *(ary + 1) + 2를 해야 일곱 번째 요소의 주소를 구할 수 있고, 이 값을 사용하기 위해선 *(*(ary + 1) + 2) 를 해줘야 일곱 번째 요소에 접근 가능하다.
*(ary + 1) == ary[1] == 116 *(ary + 1) + 2 == ary[1] + 2 == ary[1] + (2 * sizeof(ary[1][0])) == 124
그렇다... 극혐이다. 처음에 이거 보고 머리 깨지는줄 알았다. 그런데 앞으로 소개할 int ary[3][4]의 여러 가지 주소 표현을 보면 더 머리가 깨질 것이다^^
&ary, ary, &ary[0], ary[0], &ary[0][0]
이들은 모두 같은 값을 갖는다. (앞서 100이라 가정했으니 그 가정을 유지하겠다) 그러나 가지는 의미가 다른데 앞서 소개한대로 머리가 더 깨진다.
(1) &ary
이는 이차원 배열의 전체를 가리킨다. 배열 명은 논리적으로 변수이므로 변수처럼 연산자를 사용할 수 있다.
(2) ary
이는 초반에 언급했듯이 이차원 배열의 첫 번째 부분 배열(ary[0])의 시작 주소이다. 즉, 이차원 배열의 첫 번째 부분 배열 전체를 가리킨다.
(3) &ary[0]
ary[0]은 이차원 배열의 논리적 요소인 일차원 배열이고, 배열명 역할을 한다. 이곳의 주소는 100이다. 그리고 배열명은 논리적으로 변수의 기능도 하므로 주소 연산자인 &를 사용 가능하다.
(4) ary[0]
이는 위 (3)과 굉장히 비슷해 보이지만 이 친구는 이차원 배열의 요소 중 첫 번째 일차원 배열의 첫 번째 배열 요소를 카리킨다. 그리고 위 &ary[0]는 이차원 배열의 요소 중 첫 번째 일차원 배열 전체를 가리킨다.
(5) &ary[0][0]
이는 (4)과 가리키는 것도 같고, 앞서 말했듯이 위 다섯 개는 값이 전부 같다. 그럼 (4)와 다른 점이 무엇이냐면 이는 주소 연산자를 사용하여 상수 역할을 하고, (4)는 배열 명이므로 논리적으로 변수의 역할을 한다. 그래서 sizeof 연산을 수행하면 서로 크기가 다릅니다.
sizeof(ary) == 48 (배열 전체의 크기)
sizeof(&ary[0]) == 4 (주소의 크기)
sizeof(ary[0]) == 16 (부분 배열 전체의 크기)
sizeof(&ary[0][0]) == 4 (주소의 크기)
열심히 이해해서 작성했으나.. 나 이해한거 맞나?ㅋㅋ..
누군가 제가 틀리게 작성했다면 피드백 부탁드립니다 ㅎ
'C언어' 카테고리의 다른 글
[혼공C] 16-1 동적할당함수 malloc의 주의점 (0) | 2021.10.19 |
---|---|
[혼공C] 목차 정리 (0) | 2021.10.11 |
[혼공C] 13-1 변수의 영역과 데이터 공유 (0) | 2021.10.09 |
[혼공C] string.h 헤더파일 내장 함수 구현(strlen, strncpy, strncat, strcpy) (0) | 2021.10.09 |
[혼공C] 12-2 대입 연산자를 사용한다면 배열 선언과 동시에 문자열 초기화는 국룰 (0) | 2021.10.08 |
int ary[3][4]
다음은 자료형이 int [4]이고 논리적으로 세 개의 일차원 배열을 요소를 갖는 2차원 배열이다. 여기에서 일곱 번째 물리적인 요소의 값에 접근하려면 먼저 포인터 연산을 할 것이기 때문에 정수 연산에 대해 변화하는 주소를 이해해야 한다. ary는 배열의 이름이자 이차원 배열의 첫 번째 부분 배열(ary[0])의 주소를 말한다. 그러므로 ary의 시작 주소를 100이라 가정하고, ary + 1처럼 정수 연산을 하게 되면
ary + 1 == ary + (1 * sizeof(ary[0])) == 100 + 16 == 116
이런 식으로 된다. 여기서 2를 더하면 바로 일곱 번째 요소에 접근할 수 있다고 생각할 수 있지만 (ary + 1) + 2로 하면 같은 원리로 ary + 3이 되어버려서 할당 받지 않은 메모리에 접근하게 된다. 그래서 간접참조 연산자를 사용하여 *(ary + 1)로 두 번째 일차원 배열의 주소를 구해야 한다. 이후 *(ary + 1) + 2를 해야 일곱 번째 요소의 주소를 구할 수 있고, 이 값을 사용하기 위해선 *(*(ary + 1) + 2) 를 해줘야 일곱 번째 요소에 접근 가능하다.
*(ary + 1) == ary[1] == 116 *(ary + 1) + 2 == ary[1] + 2 == ary[1] + (2 * sizeof(ary[1][0])) == 124
그렇다... 극혐이다. 처음에 이거 보고 머리 깨지는줄 알았다. 그런데 앞으로 소개할 int ary[3][4]의 여러 가지 주소 표현을 보면 더 머리가 깨질 것이다^^
&ary, ary, &ary[0], ary[0], &ary[0][0]
이들은 모두 같은 값을 갖는다. (앞서 100이라 가정했으니 그 가정을 유지하겠다) 그러나 가지는 의미가 다른데 앞서 소개한대로 머리가 더 깨진다.
(1) &ary
이는 이차원 배열의 전체를 가리킨다. 배열 명은 논리적으로 변수이므로 변수처럼 연산자를 사용할 수 있다.
(2) ary
이는 초반에 언급했듯이 이차원 배열의 첫 번째 부분 배열(ary[0])의 시작 주소이다. 즉, 이차원 배열의 첫 번째 부분 배열 전체를 가리킨다.
(3) &ary[0]
ary[0]은 이차원 배열의 논리적 요소인 일차원 배열이고, 배열명 역할을 한다. 이곳의 주소는 100이다. 그리고 배열명은 논리적으로 변수의 기능도 하므로 주소 연산자인 &를 사용 가능하다.
(4) ary[0]
이는 위 (3)과 굉장히 비슷해 보이지만 이 친구는 이차원 배열의 요소 중 첫 번째 일차원 배열의 첫 번째 배열 요소를 카리킨다. 그리고 위 &ary[0]는 이차원 배열의 요소 중 첫 번째 일차원 배열 전체를 가리킨다.
(5) &ary[0][0]
이는 (4)과 가리키는 것도 같고, 앞서 말했듯이 위 다섯 개는 값이 전부 같다. 그럼 (4)와 다른 점이 무엇이냐면 이는 주소 연산자를 사용하여 상수 역할을 하고, (4)는 배열 명이므로 논리적으로 변수의 역할을 한다. 그래서 sizeof 연산을 수행하면 서로 크기가 다릅니다.
sizeof(ary) == 48 (배열 전체의 크기)
sizeof(&ary[0]) == 4 (주소의 크기)
sizeof(ary[0]) == 16 (부분 배열 전체의 크기)
sizeof(&ary[0][0]) == 4 (주소의 크기)
열심히 이해해서 작성했으나.. 나 이해한거 맞나?ㅋㅋ..
누군가 제가 틀리게 작성했다면 피드백 부탁드립니다 ㅎ
'C언어' 카테고리의 다른 글
[혼공C] 16-1 동적할당함수 malloc의 주의점 (0) | 2021.10.19 |
---|---|
[혼공C] 목차 정리 (0) | 2021.10.11 |
[혼공C] 13-1 변수의 영역과 데이터 공유 (0) | 2021.10.09 |
[혼공C] string.h 헤더파일 내장 함수 구현(strlen, strncpy, strncat, strcpy) (0) | 2021.10.09 |
[혼공C] 12-2 대입 연산자를 사용한다면 배열 선언과 동시에 문자열 초기화는 국룰 (0) | 2021.10.08 |