[{"keyword":"\ube14\ub8e8\uc544\uce74","rank":0},{"keyword":"\ubc84\ud29c\ubc84","rank":0},{"keyword":"\uc2a4\ud154\ub77c","rank":1},{"keyword":"\uc6d0\uc2e0","rank":-1},{"keyword":"\ub2c8\ucf00","rank":0},{"keyword":"\uba85\uc77c\ubc29\uc8fc","rank":"new"},{"keyword":"\ub9d0\ub538","rank":-1},{"keyword":"\ub77c\uc624","rank":9},{"keyword":"\uc2a4\ud0c0\ub808\uc77c","rank":2},{"keyword":"\uc6d0\ud53c\uc2a4","rank":-3},{"keyword":"\ubbfc\ud76c\uc9c4","rank":4},{"keyword":"\uc720\ud76c\uc655","rank":-2},{"keyword":"\uadfc\ud29c\ubc84","rank":0},{"keyword":"@","rank":-6},{"keyword":"\ub9bc\ubc84\uc2a4","rank":-6},{"keyword":"\uac74\ub2f4","rank":-2},{"keyword":"\ub358\ud30c","rank":-5},{"keyword":"\ubbf8\ub155","rank":"new"},{"keyword":"\ub358\uc804\ubc25","rank":-3},{"keyword":"\uc2a4\ud154\ub77c\ube14\ub808\uc774\ub4dc","rank":0},{"keyword":"\ub4dc\ub798\uace4\ubcfc","rank":"new"},{"keyword":"\uc778\ubc29","rank":"new"}]
(IP보기클릭)210.107.***.***
(IP보기클릭)117.52.***.***
예. 그런데. printf로 출력할때 (p+i)는 *를 붙이는데 왜 p[i]는 *p[i]라고 안 쓰는지 오히려 scanf로 값을 받을 때는 &p[i]로 배열에서 값을 받는 것 같이 쓰는지.. 이게 흰색과 백색처럼 표현만 다른 것인지..아니면 무언가 깊은 의미의 차이가 있는 것인지... 책도 마지막 장 밖에 안 남았는데...내가 이러려고 시작했나 자괴감 들고 괴롭네요 ㅎㅎ | 21.12.27 15:30 | |
(IP보기클릭)211.105.***.***
C언어 건들인지는 너무 오래되서 포인터 정확하게 기억 안나는데 나름 기억나는데로 설명이 쉽도록 써볼게요. 배열의 특이한 설정(?)과 포인터가 섞여서 헤깔리실 수 있어요. 1. 배열명은 해당 배열의 [시작 주소값]을 의미한다. 2. 배열명 + i 를 하면 배열 형태의 [크기값이 자동 적용되서 계산된다]. (char 형이면 i가 1씩 증가, int 형이면 i가 4씩 증가 이런식) 제 기억으로는 *는 값을 가져올 때 쓰는거고 &는 주소를 가져올 때 쓰는거로 기억합니다. 예를 들어 p[i]에 있는 "값이(value)" 1000이라 할 때, *p[i]를 쓰면 "메모리 주소 1000에 있는 값"을 가져와서 배열과 관련없는 쓰레기값이 나와서 이렇게 쓰면 안되는거고, &p[i]로 쓰는 이유는 p[i]는 이미 배열 특성상 주소가 자동으로 적용되어 해당 메모리에 접근한 값이잖아요? 그럼 거기 값을 가지고 있는 주소를(&) 가져 와야 해당 값이 입력되어 있는곳에 데이터를 입력 가능하겠죠? 반대의 경우를 보자면 &p[i] 대신, 주소만 쓰여있는 (p+i) 이렇게 써도 작동될거에요. scanf("%d", p+i); 이런식으로요. 즉, 배열은 특이하게 배열명이 배열의 시작 주소값을 의미하고 있어서 이로 인하여 (p+i)는 주소값을 의미하므로, &p[i]와 같다. { (p + i) == &p[i] } (p+i)는 주소값이기에, 해당 데이터에 접근하려면 *를 붙여서 *(p+i) 이렇게 접근해야한다. 고로 *(p+i)는 p[i]와 같다. { *(p+i) == p[i] } 잘못 기억하고 있는것일 수 있...진 않겠죠 ㅠㅠ? 나름 C언어 재미있어서 옛날에 한참 파고들었는데 잘못 기억하고 있는것이라면 죄송하면서 제가 너무 슬플거 같네요. 아무튼 이미 이해를 완료하셨을 수 도있지만 제 기억이 맞다는 하에 나름 최대한 이해하기 쉽게 적어봤습니다. 조금이라도 도움이 되시길 바래요. 이런 개념이 잘 잡혀있으면 이중이든 삼중이든 다 응용이라 별거 없으실겁니다. | 21.12.30 23:30 | |
(IP보기클릭)211.105.***.***
너무 오랜만에 C언어 공부하시는 분을 봐서 흥분해서 글을 길게 썻는데 혹시라도 제가 틀렸다면 말씀해주세요... 쪽팔림을 감수하고 반성하면서 나중에 다시 기회잡아 재공부 하겠습니다 ㅠㅠ | 21.12.30 23:34 | |
(IP보기클릭)59.16.***.***
답변 감사드립니다. 공부하다 보니 용어가 너무 혼동되어서 포인터는 포인터인데 배열은 [정수 포인터]라고 표현하기도 하고......union을 보니 예전 엔지니어 분들은 정말 메모리를 아껴(?)쓰려고 고생 많았겠구나...포인터도 그런 노력에서 나온게 아닐까...짐작만 하고 있습니다. 장문의 답변 감사드립니다. | 21.12.31 00:41 | |