[질의사항]
#include<stdio.h>
void main() {
int b[3][2] = { {10, 20}, {30, 40}, {50, 60} };
int(*pointer)[2];
pointer = b;
printf("pointer = %d\n", (int)pointer);
printf("pointer+1 = %d\n\n", (int)(pointer + 1));
printf("*pointer = %d\n", (int)*(pointer));
printf("*(pointer+1) = %d\n\n", (int)*(pointer + 1));
printf("(*pointer)[0] = %d\n", (int)(*pointer)[0]);
printf("(*(pointer+1)[0]) = %d\n\n", (*(pointer + 1))[0]);
printf("*(*pointer) = %d\n", (int)*(*pointer));
printf("*(*(pointer+1)) = %d\n\n", *(*(pointer + 1)));
---------------------------------------------------
printf("*(*pointer) = %d\n", (int)*((*(pointer + 0) + 1)));
printf("*(*(pointer+1)) = %d\n\n", *(*(pointer + 1) + 1));
}의 출력결과가 포인터위치에 따라 다르게 나오는데 아직 개념이 부족해서 그 이유를 모르겠습니다.
[답변]
이 C 코드는 2차원 배열과 포인터를 사용하여 배열의 다양한 요소들에 접근하는 예시입니다.
코드를 분석하기 전에, 몇 가지 기본 개념을 이해하는 것이 중요합니다.
• 2차원 배열: int b[3][2]는 정수형 2차원 배열로, 3행 2열의 구조를 갖습니다. 여기서 { {10, 20}, {30, 40}, {50, 60} }로 초기화되었습니다.
• 포인터 연산: 포인터 연산은 포인터가 가리키는 데이터 타입의 크기에 의해 영향을 받습니다. int 형 포인터는 4바이트(시스템에 따라 다를 수 있음)를 기준으로 연산합니다.
• 포인터 배열: int (*pointer)[2]는 int[2] 형태의 배열을 가리키는 포인터입니다. 즉, 각각의 엘리먼트가 2개의 정수로 이루어진 배열을 가리키는 것이죠.
이제 코드의 각 부분을 살펴보겠습니다:
1. pointer = b;
• pointer는 배열 b의 첫 번째 행을 가리킵니다.
2. printf("pointer = %d\n", (int)pointer);
• pointer의 메모리 주소를 출력합니다.
3. printf("pointer+1 = %d\n\n", (int)(pointer + 1));
• pointer+1은 배열의 두 번째 행을 가리킵니다. 배열의 각 행은 int[2]이므로, 포인터는 2개의 정수 크기만큼 이동합니다.
4. printf("*pointer = %d\n", (int)*(pointer));
• *pointer는 첫 번째 행의 첫 번째 요소를 가리키는 포인터입니다.
5. printf("*(pointer+1) = %d\n\n", (int)*(pointer + 1));
• *(pointer+1)는 두 번째 행의 첫 번째 요소를 가리키는 포인터입니다.
6. printf("(*pointer)[0] = %d\n", (int)(*pointer)[0]);
• (*pointer)[0]는 첫 번째 행의 첫 번째 요소, 즉 10입니다.
7. printf("(*(pointer+1)[0]) = %d\n\n", (*(pointer + 1))[0]);
• (*(pointer+1))[0]는 두 번째 행의 첫 번째 요소, 즉 30입니다.
8. printf("*(*pointer) = %d\n", (int)*(*pointer));
• *(*pointer)는 첫 번째 행의 첫 번째 요소를 다시 한 번 참조합니다. 결과는 10입니다.
9. printf("*(*(pointer+1)) = %d\n\n", *(*(pointer + 1)));
• *(*(pointer+1))는 두 번째 행의 첫 번째 요소를 참조합니다. 결과는 30입니다.
10. printf("*(*pointer) = %d\n", (int)*((*(pointer + 0) + 1)));
• *((*pointer) + 1)는 첫 번째 행의 두 번째 요소를 참조합니다. 결과는 20입니다.
11. printf("*(*(pointer+1)) = %d\n\n", *(*(pointer + 1) + 1));
• *(*(pointer+1) + 1)는 두 번째 행의 두 번째 요소를 참조합니다. 결과는 40입니다.
이러한 포인터 연산은 2차원 배열의 메모리 구조와 포인터의 증감 연산 방식에 따라 달라집니다. 이를 이해하는 것은 C 프로그래밍에서 중요한 개념중 하나입니다.
'무근본 IT 지식 공유' 카테고리의 다른 글
C#으로 웹소켓 서버 구현해보기 (0) | 2023.12.19 |
---|---|
천 단위로 30억 이상의 정수에 콤마 찍는 c언어 코드 (1) | 2023.11.26 |
LinkedList와 ArrayList의 차이점이 대체 뭐야? (1) | 2023.11.25 |
해시 테이블(HASH Table)과 해시 테이블의 시간복잡도는? (1) | 2023.11.25 |
파이썬 Pandas csv 파일 읽기 오류사항 해결 방법(read_csv) / groupby (1) | 2023.11.23 |
댓글