좋은 지적이십니다! 이런 궁금증이 성장으로 직결되는 것이죠. 안타깝게도 C언어에서 %s 지정자로 출력하는 스펙은 %c로 일일이 출력할 때와는 약간 다릅니다. 주소 자체를 주고, 문자열 시작 주소를 받은 다음에 그 문자열이 끝날 때의 null문자 (\0)까지 읽으면서 출력하게 되어있습니다. 조금 헷갈리지만, %c는 *을 통해서 값을 출력해야하고, %s는 주소를 준다고 외우시면 좋습니다. 이런 예외들이 C언어 스펙에는 많습니다. 예를 들어서 문자열이나 배열을 포인터변수에 할당할 때 주소를 뜻하는 &를 넣지 않는 것처럼요. 우리는 그냥 "배열과 문자열은 그 시작주소 자체를 할당한다." 라고 외워버리고 넘어갑니다. 안타깝지만 이런 것들은 언어에 대한 스펙이기 때문에 우리가 받아들이고 외우는 수밖에 없습니다. 컴파일러가 대신 해주는 부분이라서요.
이해했습니다. 레퍼런스 변수는 스택에, 내용물은 힙에 저장이 됩니다. 이부분까지 레퍼런스 변수라는 개념을 다 안다고 생각하고 시험을 치뤘는데, ==와 equals가 차이점이 있는지 몰랐네요ㅠ. 레퍼런스 변수가 힙에 저장된 내용물을 가리킵니다. ==는 같은 힙 주소에 저장되어 있는지 묻는겁니다. 레퍼런스 변수는 str1 2 3으로 스택에 따로따로 존재하지만, str1의 내용물과 str2의 내용물은 힙메모리 안에 있는 한 주소의 내용물을 공유하고 있습니다. 즉, 내용물의 주소가 같습니다."Programming"을 두 번 저장할 필요가 없으니 효율적이겠네요. 즉, 레퍼런스 변수만 str1과 str2로 따로 저장되어 있습니다. ==는 같은 힙 메모리 주소면 True 입니다. str1, str2, str3은 레퍼런스 변수로서 스택에 있고, str1과 str2의 내용물은 같은 힙 메모리 주소이기 때문에, True이고, str1과 str3, str2와 str3을 ==로 비교시는 모두 false가 나옵니다. 추가 예로 든 str3과 str4도 마찬가지로 내용물이 다른 힙 메모리에 저장되어 있기 때문에 false가 나옵니다.
여러분! 비전공자분들을 위한 정보처리기사 실기 강의를 런칭했습니다 :)
링크 바로가기 >> inf.run/zSrvA
감사합니다
감사합니다 선생님 !! 덕분에 도움이 많이 되었습니다 👏🏻
고맙습니다 3수생인데 이번엔 꼭 붙길
좋은 정보 감사합니다.
ㅋㅋㅋㅋㅋ실기공부하는데 이분 강의가 최고입니다!
최고의 찬사 감사합니다 :)
선생님 덕분에 도움이 많이되고있어용!! 시험 잘 보겠습니당!
감사합니다:) 이번에 강의 런칭했는데, 필요하시면 한 번 살펴봐주세요..^^
링크 >> inf.run/zSrvA
3:20 10초를~ 색깔 바꾸는데 쓰고있어여 정신나갔져~ ㅋㅋㅋㅋㅋ 넘웃깁니닼ㅋㅋ
감사합니다 최고
13번에서
출력할때, printf("%s"
", n1); // n1은 포인터이니까 값을 가리키려면 *n1 이라고 해야하지 않나요?
좋은 지적이십니다! 이런 궁금증이 성장으로 직결되는 것이죠.
안타깝게도 C언어에서 %s 지정자로 출력하는 스펙은 %c로 일일이 출력할 때와는 약간 다릅니다.
주소 자체를 주고, 문자열 시작 주소를 받은 다음에 그 문자열이 끝날 때의 null문자 (\0)까지 읽으면서 출력하게 되어있습니다.
조금 헷갈리지만, %c는 *을 통해서 값을 출력해야하고, %s는 주소를 준다고 외우시면 좋습니다.
이런 예외들이 C언어 스펙에는 많습니다. 예를 들어서 문자열이나 배열을 포인터변수에 할당할 때 주소를 뜻하는 &를 넣지 않는 것처럼요. 우리는 그냥 "배열과 문자열은 그 시작주소 자체를 할당한다." 라고 외워버리고 넘어갑니다.
안타깝지만 이런 것들은 언어에 대한 스펙이기 때문에 우리가 받아들이고 외우는 수밖에 없습니다. 컴파일러가 대신 해주는 부분이라서요.
우왕~ 설명 감사합니다~~~~
절대 안 헷갈리겠어요. 덕분에 코드가 보이기 시작합니다^^
case 문의 case 7 의 공백은 엔터값으로 안들어가나요?
내일 시험 꼭 합격할게요
리터럴로 만든거랑 생성자로 만든거 왜 다른지 몰라도 된다고 하니까, 다시 들어와서 보니 또 틀렸어요ㅠ. 생성자로 만든거는 스택에 저장이 되서 다른건가요?
이해했습니다. 레퍼런스 변수는 스택에, 내용물은 힙에 저장이 됩니다. 이부분까지 레퍼런스 변수라는 개념을 다 안다고 생각하고 시험을 치뤘는데, ==와 equals가 차이점이 있는지 몰랐네요ㅠ.
레퍼런스 변수가 힙에 저장된 내용물을 가리킵니다. ==는 같은 힙 주소에 저장되어 있는지 묻는겁니다. 레퍼런스 변수는 str1 2 3으로 스택에 따로따로 존재하지만, str1의 내용물과 str2의 내용물은 힙메모리 안에 있는 한 주소의 내용물을 공유하고 있습니다. 즉, 내용물의 주소가 같습니다."Programming"을 두 번 저장할 필요가 없으니 효율적이겠네요. 즉, 레퍼런스 변수만 str1과 str2로 따로 저장되어 있습니다. ==는 같은 힙 메모리 주소면 True 입니다. str1, str2, str3은 레퍼런스 변수로서 스택에 있고,
str1과 str2의 내용물은 같은 힙 메모리 주소이기 때문에, True이고, str1과 str3, str2와 str3을 ==로 비교시는 모두 false가 나옵니다. 추가 예로 든 str3과 str4도 마찬가지로 내용물이 다른 힙 메모리에 저장되어 있기 때문에 false가 나옵니다.
감사합니다
감사합니다
감사합니다