지금 C기초플러스 배열과 포인터 chapter 10하고있는데..
이해가 정말 안됩니다 .. 15page정도 남겨두고 복습 안하면 뒤에 읽어도 이해 못할거같아서 복습하고 처음부터 다시 공부를 하려고 하는데요.
일단
int *pt
int ar1[2][3];
pt = ar1 ; // 유효하지 않다
라고 하는데.. pt는 int형을 가리키는 포인터잖아요
근데 ar1은 배열이니까.. ar1만 써도 주소를 나타내는 건데
왜 pt = ar1; 이 틀리게 되는거죠 ?
그리고 const의 개념도 헷갈리는데요.. 이게 예전에는 그냥 const int SIZE = 4;
이렇게하면 SIZE라는 변수는 무조건 4를 갖는 값이다. 로 알고있는데요
배열과 포인터에서는 조금 다르더라구요
상수 데이터의 주소나, 상수가 아닌 데이터의 주소를 상수를 가리키는 포인터에 대입하는 것은 유효하다.
double rates[5] = { 1,2,3,4,5 };
const double locked[4] = {1,2,3,4};
const double *pc = rates;
pc = locked;
pc = &rates[3];
이건 다 유효한 반면에
double rates[5] = { 1,2,3,4,5};
const double locked[4] = {1,2,3,4};
double *pnc = rates; // 유효함
pnc = locked ; // 유효하지 않음
pnc = &rates[3]l; // 유효
라고하는데
const double locked[4] = {1,2,3,4}; 이 말이 lock[0] lock[1] lock[2] lock[3] 에 차례대로 1,2,3,4 값을 넣는데 이 값은 변경할 수 없다
이런 의미가 아닌가요 ? 포인터에 const를 쓰는게 무슨말인지 잘 이해가 안가고
전체적으로 헷갈리니까 개념이 뒤죽박죽 되는 것 같은데 어디 배열과 포인터 잘 설명해주는 곳이 없나요 ?
C기초 플러스 번역서로 공부중인데 많이 어렵네요 ..
pt = ar1;은 유효할텐데? int ar1[2][3];
ar1 = pt가 유효하지 않은거겟지
pt = ar1; 은 pt는 int형 하나를 가리키지만, ar1은 int형 3개짜리 배열을 가리킨다. 라고 설명하면서 유효하지 않다고 하는데, 2개짜리 배열도아니고 3개짜리 배열인지도 잘 모르겠씁니다.. 그리고 주소인데 그게 무슨 상관인지도 잘 모르겠고요
위에 댓글 다른거랑 착각하는듯?
저 말씀하시는건가요 작성자입니다
너 말고 ㅁㄴㅇㄹ 한테 한 말이야
2차원 배열의 주소값은 arr[0] 이런식으로 받아야함 ㅇㅅㅇ 즉 arr[0] 그자체가 포인터 주소이며 arr[0][0]가 해당하는 값이됨 따라서 pt = ar1 -> pt = ar1[0] 요렇게 포인터 주소를 얻어와야함 ㅇㅅㅇ 2차원배열에서 그냥 배열이름으로 포인터 주소 못얻어오는건 걍 문법적으로 안된다고 생각하고 받아들여
혹시 인터넷에 알고계신 배열과 포인터쪽 잘 설명해놓은 곳 어디없나요? 책으로 독학하려하는데 너무 어렵네요
arr[0] 그 자체가 포인터 주소인데 이 값을 읽으려면 *arr[0] 해야하는건가요 ? 다차원배열은??
아니 *arr[0] 하면 arr[0] 값을 읽는다는건데 arr[0]에 포인터주소가 들어있으면 **arr[0] 해야 arr[0][0]값을 얻는건가요 ? arr[0][1] 을 얻르려면 어떻게해야하나요 ?
자 int ar[2][3]로 배열을 선언했어 그러면 ar[0]은 포인터이며 ar[0][0] 부터 ar[0][2]까지의 차례대로 할당된 메모리의 제일 첫번째 항목을 가르키게돼 그러면 *ar[0] 하면 그 배열의 첫번째 항목을 가르키게되므로 실질적으로 가르키는주소는 ar[0][0]에 해당되는 주소가되겠지 따라서 *ar[0] = 3; 을 넣고 arr[0][0]값을 출력하면 실제로 3이 출력되는걸 확인할수있어 ㅇㅅㅇ
근데 여기서 *(ar[0] + 1) 을 하면 어디를 가르키겠어 ar[0]이 가르키는 주소는 ar[0][0]이 되니까 포인터 연산에서 +1하면 int 바이트수만큼 이동된 주소를 가르키게되니 *(ar[0] +1) 이 가르키는 주소는 ar[0][1] 이 되겠지 ㅇㅅㅇ 따라서 *(ar[0] +1) = 5; 를 대입하고 ar[0][1]의 값을 출력하면 5가 출력되는걸 볼수있을꺼야
오 이건 완전히 이해가 됐습니다 감사합니다
누가 맞는겨..
pnc = locked ; 가 유효하지않은이유는 locked 배열이 const로 선언되고 그 배열항목들을 바꾸지 않겠다는 의미인데 const없이 일반 포인터 double* ptr 로 주소를 얻어오면 *ptr = 1이런식으로 const로 선언된 배열의 내용물이 바뀔수있으므로 컴파일수준에서 문법적으로 허용하지 않겠다는 거임 따라서 const double* ptr = locked; 로 하면 이건 문법적으로 허용됨
포인터에 const를 쓰는 이유는 뭔가요 ? const로 선언된 배열 주소를 넣기위해 const를 사용하는건가요 ?
포인터에 const를 쓰는 이유는 포인터값이 변경하지 않길 원한다던가 기타의 이유가 있어서 그런게아니라 값이 변경되지 않아서 const로 선언한 배열의 주소를 담기위해 "문법적으로" const를 사용해서 포인터를 선언하는건가요 ?
const int* value; 의 의미는 value가 가르키는 값을 변경하지 않겠다라는 의미이고 int* const value; 는 포인터주소를 바꾸지 않겠다는 의미야 따라서 가르키는 값고 바꾸고싶지않고 포인터 주소를 저장하는 값 value값도 변경하길 원치않는다면 const int* const value = 주소 로 받아야해
그러니까 이미 const int locked[4][5] 라는 배열을 선언하면 locked의 배열 값은 포인터로 넣든 안넣든 안바뀌는거 아닌가요 ? 굳이 포인터도 const int * value; 를 함으로써 한번더 해야하는건 그냥 문법적인건가요 ?
왜 const로 선언한 배열의 주소값은 const int * 로 선언한 포인터로밖에 받을 수 없는지가 궁금합니다. 문법적인거라고 암기해버리면 될까요 ?
만약 const int locked[4] = { 1, 2, 3, 4 };로 쓰고 locked[0][0] = 1; 이렇게 해버리면 locked[0][0] 의 내용물을 바꾸겠다는 의미가 되므로 이건 문법적으로 허용이 안되 ㅇㅅㅇ const 로 선언했는데 내용물을 바꾸려고했으니까 근데 만약에 int* ptr = locked; 라는 문법이 허용이되버리면 const 선언이 없으니 "ptr을 이용해서 그 값을 변경하는걸 허용하겠다"라는 선언이 되어버리고 말아. ㅇㅅㅇ
근데 애초에 const로 선언한다는것은 "한번초기화 되면 어떠한 일이 있어도 바꾸지않겠다" 라는 의미가 내재되어있는건데 const 없이 선언된 포인터변수로는 접근이 가능하고 변경이 가능하기때문에 이러한 선언은 컴파일에서 막아버리겠다는거지 ㅇㅅㅇ
결과적으로는 그렇게 받아들여 다른 컴파일러에는 const없이 ptr로 가르키게 허용되는 컴파일러도 있을꺼야 ㅇㅅㅇ 그냥 비주얼스튜디오가 그런거 허용안된다고 막아놨다고 생각하면됨
아하 문법을 그렇게 정한건가요 ? const int locked[4] = {1,2,3,4}; 하고 int *ptr = locked 한다음 *ptr =1 하면 컴파일러가 오류를 잡아낸다고 생각했네요 ..
혹시 메일 주소나 고닉있으시면 말씀해주시면 안될까요 ? 군인이라 카톡은 못하고 정말 감사해서 휴가나가면 기프티콘이라도 보내드릴게요 .. 자주자주 답해주시면 감사할 것 같습니다 ㅠㅠ
제가 프로그래밍도 모르고 글도 잘 못써서 질문자체를 이해못하시거나 무시하시는분들이 많은데 이렇게 자세하게 가르쳐주시니까 정말 감사합니다 ㅠㅠ
잘못썻다 locked[0][0]이 아니라 locked[0] ㅇㅅㅇ
감사합니다.. 30분정도 더 복습하고 자고 내일 마저 배열이나 포인터쪽 개념 잡아야겠네요 .. 많은 도움 됐습니다 감사합니다
형님 혹시 고닉같은거 없나요 ? 친목질은 아니지만 귀찮더라도 나중에 한번 더 물어보고 싶습니다
int arr[2][2]; int* pt = &arr[0][0]; int* pt2 = arr[0]; return 0;
웹컴파일러로 해보니 222.235 말이 맞음
넵 감사합니다
cpp에서는 오류고 c 는 경고 처리야
어떤거 말씀하십니까 ?
pt = ar1;
다차원 배열은 배열이름을 주소로 쓰는걸 안하는게 좋겠군요
int (*pt)[3] = ar1; 이게 일치하는 형식이야 포인터배열 파트 찾아서 읽어봐
https://hashcode.co.kr/questions/83/const-int-const-int-const-int-const-%EA%B0%84%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%8A%94-%EB%AD%94%EA%B0%80%EC%9A%94