게시글
질문&답변
static int가 아닌 int로도 메모리 주소가 계속 같습니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다. 이해하신 내용들과 생각하신 방향성 모두 문법과 개념적으로 정확하십니다.다만, 컴파일러가 스택 메모리와 관련된 최적화를 진행하여 다음 함수 호출시에도 동일한 주소를 할당 받도록 하여 재사용하도록 하는 것입니다.컴파일러 최적화를 고려했을 때 일반적으로 정상적인 동작입니다.꼼꼼하게 다방면으로 생각해보시면서 직접 실행해보시는 부분이 인상 깊네요! 화이팅입니다.
- 1
- 2
- 18
질문&답변
동적 변수 질문이요!
안녕하세요? 질문&답변 도우미 Soobak입니다. 같지 않습니다.int *r1 = new int[col];: 여기서 r1 은 포인터(int*)이며, 동적으로 할당된 배열의 첫 번째 원소의 주소를 저장하게 됩니다.new int[col] 은 int 타입의 배열을 동적으로 생성하고, 배열의 첫 번째 요소의 주소를 반환합니다. 반면,int r1; int *r1 = &r1; int col = r1;: 이 코드는 우선 문법적으로 옳지 않아 컴파일 오류가 발생합니다.int *r1 = &r1; 이 부분에서, 기존 r1이 이미 정의되었으므로 같은 이름의 변수를 선언할 수 없기 때문입니다.질문주신 내용의 맥락 상으로 int *r1 = &r1; 가 가능하다고 가정하더라도, col = r1; 부분에서 int* 타입을 int 에 할당하는 것이므로 컴파일 오류 발생합니다. 이해를 돕기 위해 동적으로 생성하는 배열이 아닌, 정적 배열에 대한 경우로 예를 들어보자면 다음과 같습니다.int arr[col]; // 정적 배열 선언 int *r1 = arr; // 배열의 첫 번째 요소의 주소를 포인터에 저장: arr 은 정적 배열이며, arr 자체가 배열의 첫 번째 요소의 주소를 나타냅니다. r1 은 arr 의 첫 번째 요소의 주소를 가리키는 포인터입니다. 이와 비슷하게, int *r1 = new int[col]; 에서 r1 은 동적으로 생성된 배열의 첫 번째 요소의 주소를 가리키는 포인터입니다. 마지막에 질문주신 "int *r1의 int랑 new int[col]의 int랑 타입은 항상 같아야 하는가?" 에 대해서는 옳습니다.포인터를 통해 배열의 첫 번째 원소의 주소를 가리킬 때, 포인터의 자료형은 배열의 자료형과 같아야 합니다.
- 1
- 2
- 22
질문&답변
13.4 double 템플릿 추가한 뒤로 obj 중복으로 실행되지 않습니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다. 사진의 콘솔 창과 프로젝트 목록을 자세히 보니, chapter13-4 프로젝트에서 Storage.cpp 파일 뿐만 아니라, 함수 템플릿 특수화.cpp 라는 파일이 있네요. 해당 파일에서 "Storage.h" 헤더를 포함시키고 계시지는 않는지 확인해보시면 좋을 것 같습니다.만약, 두 .cpp 파일에서 모두 동일한 "Storage.h" 헤더를 포함하게 되어 템플릿 특수화가 중복 정의 되어 링킹 과정에서 문제가 발생하게 됩니다.
- 1
- 3
- 29
질문&답변
for each반복문에 대해서요
안녕하세요? 질문&답변 도우미 Soobak 입니다. number 변수에 대해 말씀해주신 설명은 옳습니다.즉, 해당 for 반복문의 지역 범위 안에서만 존재하며, 반복문이 끝나면 사라집니다. 다만, 배열뿐만 아니라, 이터레이터(반복자)를 제공하는 컨테이너에서 모두 사용 가능합니다.예를 들어서, std::array 와 std::vector, std::set, std::map 과 같은 다양한 컨테이너에서 모두 사용 가능합니다.이에 대한 내용은 질문 주신 섹션의 이어지는 강의 6.20 std::array 소개 와 6.21 std::vector 소개, 그리고 추후 섹션 17 표준 템플릿 라이브러리 에서 보다 자세하게 학습하시게 됩니다.
- 1
- 2
- 22
질문&답변
char 포인터 관련 질문
안녕하세요? 질문&답변 도우미 Soobak 입니다. 포인터를 처음 접하실 때 혼동하기 쉬운 부분에 대한 질문이시네요.일반적인 값 을 담는 자료형과 주소 를 담는 포인터 자료형 사이에서 혼동이 있으신 것 같습니다.char 자료형은 말씀해주신 것 처럼, 1 바이트 크기를 가지며, 문자 값을 저장합니다.하지만, char* (문자 포인터) 자료형은 실제 데이터가 저장된 메모리 주소 를 가리키는 주소값을 저장하는 변수 입니다. (운영체제와 컴파일러 환경에 따라 말씀해주신 것처럼 4바이트, 혹은 8 바이트의 크기를 가집니다.)따라서, char c = 'A'; // 1바이트 char *p = &c; // p는 c의 '주소' 를 저장 (4바이트 또는 8바이트): 여기서 p 가 담고 있는 값은 c 의 메모리 주소이며, 포인터 변수는 값의 실제 크기가 아닌, 메모리 주소의 크기를 가지고 있기 때문에 오버플로우와 같은 문제가 발생하지 않습니다. 이해가 어려우시거나 궁금하신 점 있으시면 편히 댓글 달아주세요.
- 1
- 2
- 24
질문&답변
이 워닝은 왜 뜨는 걸까요?
안녕하세요? 질문&답변 도우미 Soobak 입니다. scanf() 함수는 사용자가 입력한 값을 변수에 저장하는 기능을 하는 함수입니다.이 때, scanf() 함수는 '성공적으로 읽은 변수의 개수' 를 반환합니다.즉, 몇 개의 변수를 정상적으로 입력받았는지 확인할 수 있습니다.여기서, 이러한 반환값을 사용하지 않고 있다는 내용과 관련하여 컴파일러가 경고를 출력해주는 것입니다.교수님께서 이어지는 강의에서 설명해주시기도 하는데요, #define CRTSECURE_NO_WARNINGS 전처리기를 사용해서 이러한 경고를 무시할 수 있습니다.보다 자세한 설명이 담긴 교수님의 답변 링크를 첨부드립니다. https://www.inflearn.com/courses/lecture?courseId=324482&unitId=28109&tab=QnA&category=questionDetail&q=67969
- 1
- 2
- 17
질문&답변
2진수 1010 0010 을 무부호 10진수로
안녕하세요? 질문&답변 도우미 Soobak 입니다. 흥미로운 질문이시네요."2진수"그 자체는 프로그래밍에서의 자료형이 아닌 단순한 숫자 표현의 방식으로, 1010 0010₂ 라는 순수한 숫자, 즉 부호 없는 2진수 로 해석하는 것이 가장 자연스럽다고 생각합니다.다만, 말씀해주신 내용처럼, 비트가 부호에 대한 정보를 담고 있는 경우를 고려하는 맥락에서는 질문자님의 말씀대로 두 가지 경우로 변환될 수 있을 것 같습니다.꼼꼼하게 경우를 나누어서 잘 생각하신 점이 인상 깊네요!
- 1
- 2
- 20
질문&답변
안녕하세요 혹시 제가 이해한게 맞을까요
안녕하세요? 질문&답변 도우미 Soobak 입니다. 네, 잘 이해하고 계십니다.void printColorName(Colors color) 함수는 Colors 라는 열거형 클래스 (enum class)의 매개변수 color 를 받습니다.이 때, color 인수는 Colors 열거형 클래스에 정의된 값 중 하나만 가질 수 있습니다.즉, Colors 에 정의되지 않은 값은 인수로 전달할 수 없습니다.열거형 클래스를 사용하실 때에는 Colors::BLACK 와 같이 명시해주셔야 하며, 인수로 값을 전달할 때에도 마찬가지입니다.
- 1
- 2
- 27
질문&답변
디버깅이 안돼요
안녕하세요? 질문&답변 도우미 Soobak 입니다. 첨부해주신 사진 만으로는 제가 구체적인 도움을 드리기 어렵네요.우선, VSCode 환경에서 학습을 진행하시는 것으로 보입니다.VSCode 의 경우 Visual Studio 와 다르게, 기타 환경 설정을 해주어야 하는 부분들이 많아 어려운 부분들이 많습니다.따라서, 개인적으로 입문 단계에서는 VSCode 가 아닌 Visual Studio 를 사용하시는 것을 추천 드립니다.그럼에도 불구하고, VSCode 로 학습 진행을 원하신다면, 교수님께서 올려주신 유투브 강의 링크를 첨부드리오니, 해당 링크의 2:18 초 부분부터의 VSCode 설정 관련 내용을 참고하시어 설정에 대한 내용을 이해해보시면 도움이 되실 것 같습니다. https://www.youtube.com/watch?v=UqCZda8DLGc
- 1
- 3
- 31
질문&답변
11.8 코드 풀이
안녕하세요? 질문&답변 도우미 Soobak 입니다. *arr[j] 는 arr[j] 가 가리키는 문자열의 첫 번째 문자(char)를 의미합니다.예를 들어, "hello" 라는 문자열의 경우 다음과 같습니다.arr[j] = "hello"; // arr[j]는 문자열의 첫 번째 문자를 가리키는 포인터 (char*) *arr[j] = 'h'; // *arr[j]는 'h' (문자의 값)이 때, strcmp() 함수의 원형은 int strcmp(const char *str1, const char *str2) 으로,두 개의 문자열(char*)을 비교하는 함수입니다.따라서, arr[j] 는 문자열을 가리키는 포인터(char*)이므로 strcmp() 의 인수로 적절하지만,*arr[j] 는 해당 문자열의 첫 번째 문자(char)이므로 strcmp() 의 인수로 적합하지 않는 것입니다.
- 1
- 2
- 19