안녕 형들
C언어 포인터 공부하는 좆대딩인데... 2차원 포인터가 좀 햇갈려서 질문점..
#include <stdio.h>
main() {
int a[3][2] = {{0,1},{2,3},{4,5}};
int (*ap)[2];
....
}
ap에 a의 주소를 담을려고 하는데
왜 (*ap)[2]에서 2를 int a의 2랑 맞추는거임?
배열과 포인터 관계에서 다차원 포인터는 행을 기준으로 잡고 요소에 접근하는건지 알았는데...
막상 2차원 포인터에서는 요소 갯수에 기준을 맞추는 거같아서.... 이해좀 시켜줘요 늅늅
레이저포인터써라
으엉 제발좀 알려줘여
레이저빔! 피슝피슝
\"int a[3][2] ;\" 라고 기술하면, a는 포인터 상수가 돼. 포인터 상수는 값이 고정된(변하지 않는) 포인터 값이니까, 포인터 연산을 할수 있어. 이차원배열로 선언하면 역참조 연산(*a) 을 두번할수 있는데, 이과정에서 3가지 타입으로 전이돼. (a+i) -> *(a+i) -> *(*(a+i) + j).
첫번째 상태 a+i 에서 이 더하기 연산이 ..단지 대수적인 더하기 연산을 하면 의미가 없어. a가 int 에 대한 포인터임으로 a + 1은 실제 a + ( 1 x sizeof(int)) 가 되어야지. 이걸 포인터 + 연산이라해. 보통 + 연산하고 틀리지.
두번째 상태 *(a+i) + j 인경우 이때 이 포인터 + 연산이 과연 어떻게 정의되어 할까? 이건.. int[2] 크기 많큼이야. 실제 배열선언은 대략 이런식으로 , 실제 배열 포인터 상수(a)에 대해 어떻게 포인터 연산(+) 을 어떻게 해야하는지 정의해주고, 그리고 메모리도 할당해.
우왕 친절한 가르침 굽신굽신 ㅠㅠ
그러면
같은 의미로 int (*ap) [2] 는 포인터 변수 ap 를 정의해. 이 변수는 포인터 연산 + 의 기본단위를 sizeof(int[2])가 되도록 정의돼.
즉, 배열선언은 메모리를 얼마나 할당할지 정의하고, 또한 포인터 연산시 어떻게 포인터 연산을 해야하는지 정의해.
대략설명하는거라 틀린부분이 있을지도 모르겠는데, 얘기하고자 하는바는 배열선언이나 포인터 변수 선언시 어떤 정보를 주려고 하는거지 생각하면 이해하기 편할거라 봐.
아하 그러면 결국 (*ap)[2]는 아까 int a[3][2]에서 요소가 한 행에 두개가 들어가니깐 sizeof()를 때리면 4byte * 2 해서 8byte가 되니깐 그걸 맞춰주기 위해서 ap도 같이 [2]로 크기를 잡아주는건가요??
그럼 만약에 본문 코드대로라 a[2][1]을 포인터를 통해서 값을 뽑아내려면 ap를 어떤식으로 받아야해요? 똥뉴비라 계속 질문만해서 지송요 ㅠㅠ
분명 두개가 호환되긴 하지만, 엄밀히 말하면 정의 자체가 틀려. 두개의 선언이 의도하는 바는 분명히 틀려. 단지 두개 타입모두 최초 역참조 연산시 포인터 연산(+) 이 같게 동작하는것 뿐이야.
a[2][1] 의 모든 값을 어떤식으로 (어떤 연산을 통해서) 뽑아내느냐에 따라 틀리겠지만, 하나하나 뽑아낸다면, int *ap 로 뽑아내면 되지.
int *ap <=> int (*ap) [1] 같은 표현이야.
위에서 두개는 실제로 같은데 뒤에꺼는역참조 연산이 두번가능하니, 이차원배열형태로 접근할수 있지
으아 그럼 횽이 위에서 말한거대로 뽑아내면 ap = a;로 잡고 *(*ap + 2) + 1) 로 잡으면 a[2][1]에 접근할 수 있는거겠네요
맞아. 그리고 C 에서 a[i][j] 의 정의는 *(*(a+i) + j) 야. 관련 책이나 문서를 천천히 다시봐.
*ap 랑 (*ap)[1] 이랑 같은 표현이라면... (*ap)[2]인 경우엔 ... *ap를 어떻게 표현해야하는거에요? 아으 역시 포인터 이해한 사람은 대단하구나 ㅠㅠ
넵넵 우왕 도움이 정말 많이됐어요 진짜진짜 고맙습니다 늅늅......
같은 표현이라는거는 내가 잘못말했다. 머라고 해야 하나... 뽑아 낼수 있는게 결국 같다는 말이었어.
에, 어차피 저런 표현이 직관적인거도 아니고, 대부분 자신이 쓰는 표현방식하나를 외워서 쓰는형태야. 아마 위에서 설명한 부분중 틀린부분이 있을지도 모르겠다. C를 오래했다고 저런거를 익숙하게 쓱쓱 생각하는건 아니야.
책 한번 더 읽어보면서 공부해볼게요 친절한 답변 감사하빈당 ㅠㅠ
아 정말요?? 아무래도 C언어에서 가장 개념이 어려운부분이 포인터라고 들었는데 오래한사람들은 그냥 슥슥 작성하는거처럼 보여서요 ㅋㅋㅋ
일단은 대충 이해만 하고, 외워. 내가 어떤 형태를 표현하고자 하는게 중요하지 문법적으로 완전히 익숙해질필요는 없어. 너무 무리해서 마스터하려고 하지마. 일단 대충 넘어가는것도 한 방법이야.
실제로는 1차포인터정도만 자주 쓰고, 배열은 2차..정도..그이상은 거의 안써. (1차 포인터에 대한 1차포인터는 2차포인터지만, 실제 다루는건 1차포인터야.나중에 typedef 같은 추상화를 배우면 이해할듯. 어쨋든 지금 너무 무리해서 마스터하려고 하지마)
아.. 괜히 하나라도 놓치면 이해가 안될거같아서 계속 집착하다보니깐 그랬나봐요 ㅠㅠ 횽 충고 감사합니당 흑흑
어 그럼 포인터로 2차 배열에 접근을 잘 안하는 편이에요? 1차 포인터면 그냥 *(a + i)형식만??
음..일단은 책에 설명된 포인터 그림을 이해하고 그릴줄만 알면돼. 그걸 문법적으로 어떻게 표현하는지는 일단 넘어가. 복잡한걸 표현할일도 거의 없고, 혹 그럴일이 있을때는 그때 잠깐 삽질하면돼. 일단 그림으로 그릴줄 알면 거기서 OK. 문법은 좀더 나중에 익숙해져도 되니 지금은 일단 대 ~ 충 이런식으로 연산하는구나 하고 넘어가.
어차피 C/C++ 문법을 마스터하는건 불가능해. 나중에 보고 꼭 필요하고 자주 쓰는것만 골라서 익숙해지면 돼.
아 그렇구나... 조언 감사합니당 ㅎㅎㅎ 꼭 새겨들을게요