2차원 배열의 주소 관련 질문.
253
작성한 질문수 15
본강의의 코드중
int main()
{
//int a = 3;
//int arr[a];
int data[ROWS][COLS] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 0, 1, 2}
};
printf("%d\n", data[2][3]);
int* ptr = &data[0][0];
printf("%d\n", *(ptr + 3 + COLS * 2));
return 0;
}
위의 코드에서 int* ptr = &data[0][0] 부분이 헷갈리는데요.
교수님이 지난강의에서 설명 하셨던거 처럼 2차원 배열이더라도 결국에 메모리에는 1차원 으로 저장되어있기때문에
data, &data[0], &data[0][0] 3개가 모두 같습니다.
그런데
int* ptr = &data[0]를 하면 output에서 워닝이 발생하고
int* ptr = data도 워닝이 발생합니다.
지난강의를 다시 한번 더 복습했는데도 이해가 잘 안되네요 ㅜㅜㅜㅜㅜ;;;;
지금 포인터에서 계속 막히는데 프로그래밍은 그냥 관두는게 좋을까요? 아무래도 저는 이해가 계속 안되는거 같아서요.
답변 3
5
안녕하세요? 포인터에서 안막히는 사람 없습니다. 원래 발전은 계단식으로 이뤄집니다. 포기할지 말지는 포인터 이해 가느냐 마느냐 보다는 내가 IT 분야에서 일하고 싶은지 아닌지로 결정하시는게 적당한 기준입니다. 재미가 없어서 무의식이 하기를 싫어하는 것과 두뇌가 새로운 개념을 만나서 적응하느라 힘든 것은 차이가 있으니 현명하게 대처하셨으면 좋겠습니다.
4
안녕하세요
int(*ptr)[4] = &data[0]; 이렇게 선언 하셔야 합니다. &data 는 int를 가리키는 포인터가 아니라 int[4] 배열을 가리키는 포인터이기 때문입니다.
이차원 배열은 일차원 배열의 배열이라고 생각하시면 됩니다. 이말은 곧 이차원 배열은 곧 배열의 주소들이 원소인 일차원 배열과 같다고 말할 수 있겠죠.
질문자님의 코드로 예를 들자면
data[0] 은 {1, 2, 3, 4} 배열의 주소를 담는 int* 포인터입니다.
data[1] 은 {5, 6, 7, 8} 배열의 주소를 담는 int* 포인터입니다.
data[2] 은 {9, 0, 1, 2} 배열의 주소를 담는 int* 포인터입니다.
data 는 { data[0], data[1], data[2] } 배열의 주소를 담는 int[4] * 포인터입니다. (즉 원소들이 길이 4인 배열의 주소들을 담은 배열입니다.)
https://www.inflearn.com/questions/130623
제가 드린 답변인데 위와 같은 형식을 그림으로 그려놨어요. 이해에 도움이 되셨으면 좋겠습니다.
원래 포인터가 가장 어렵습니다. 프로그래밍에 있어 가장 가장 중요한 부분이지만 가장 어려워요.. 저도 학부시절 처음 배웠을 때 멘붕 그 자체였습니다. 😭
포인터의 개념을 이해하시려면 메모리 구조를 들여다보고 익히는게 정말 중요한 것 같아요.
디버깅 하는 방법 모르시다면 검색해보시면 쉽게 배우실 수 있으니 디버깅 하는 방법을 반드시 익히셔서 디버깅을 통해 메모리의 주소와 값을 들여다보고 이를 통해 포인터와 메모리의 구조를 파악하는 연습을 꼭! 해보세요. 정말 도움이 많이 됩니다.
그리고 <C언어의 정석>이라는 책 추천합니다. 메모리에 어떻게 자리 잡힐지, 주소가 어떻게 될지 등등 그림으로 잘 표현되어 있는 책이라 포인터 개념을 공부하기에 적합한 책이라고 생각해요. 제가 처음 C 공부할 때 도움을 많이 받았던 책입니다.
화이팅!!
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
50
3
main 함수에서 왜 int만 선언이 되는걸까요
1
54
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
53
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
46
1
프로토타입과 함수간의 인자 불일치
1
72
2
12.12 헤더 관련 질문
1
59
2
Visual Studio Community 2026 사용 문의
1
136
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
59
2
getchar(), putchar()
1
92
3
강의자리ㅛ
1
78
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
112
2
소스파일안에 여러 파일
1
75
2
F5와 F7의 차이
1
75
2
c = TWO * (a+b); 에서 a와 b는?
1
58
2
; 세미콜론을 붙이는 기준에 문의
1
68
1
Step over 기능 문의
1
52
2
2.6 강의 따옴표 출력 규칙 문의
1
74
2
int main 함수 관련 오류 문의
1
67
2
13.4 words[0]
0
60
2
11.7 함수를 구현해 봤습니다.
1
62
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
64
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
53
2
11.6 fit_str함수를 구현해 봤습니다.
1
53
2
11.5 코드 구현
1
67
2





