묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨홍정모의 따라하며 배우는 C언어
swap 함수 작성하기
홍 선생님께선 swap 함수에서 temp를 선언하실 때 정수형 자료형으로 선언하셨는데 저는 정수형 포인터 변수로 선언하고자 했어요.void swap(int* a, int* b){ int* temp = NULL; *temp = *a; *a = *b; *b = *temp; }이렇게 함수를 작성해서 코드를 실행하려고 하는데 빌드는 성공했지만 실행은 실패했어요.다만 함수를 아래처럼 고치면 정상적으로 작동하더군요.void swap(int* a, int* b){ int c; int* temp = &c; *temp = *a; *a = *b; *b = *temp;}혹시 첫 번째 코드에서 temp 변수의 주소를 NULL로 초기화 한 부분이 문제였을까요?
-
해결됨홍정모의 따라하며 배우는 C++
(6.9) 포인터 주소를 찍어보는 구간에서 질문이 하나 생겼어요.
안녕하세요! 6.9강의에서 포인터 주소를 하나하나 찍어보는 구간에서 질문이 하나가 생겼습니다. #include <iostream> using namespace std; int main() { int i = 2; int *ptr_i = &i; double d = 3.14; double *ptr_d = &d; cout << "int형 포인터 ptr_i의 크기는 " << sizeof(ptr_i) << endl; cout << "ptr_i가 참조하는 변수 자체의 크기는 " << sizeof(*ptr_i) << endl; cout << "double형 포인터 ptr_d의 크기는 " << sizeof(ptr_d) << endl; cout << endl; cout << "------이하 ptr_i------" << endl; cout << "-1번째 : " << uintptr_t(ptr_i - 1) << endl; cout << "0번째 : " << uintptr_t(ptr_i) << endl; cout << "1번째 : " << uintptr_t(ptr_i + 1) << endl; cout << "2번째 : " << uintptr_t(ptr_i + 2) << endl; cout << endl; cout << "------이하 ptr_d------" << endl; cout << "-1번째 : " << uintptr_t(ptr_d - 1) << endl; cout << "0번째 : " << uintptr_t(ptr_d) << endl; cout << "1번째 : " << uintptr_t(ptr_d + 1) << endl; cout << "2번째 : " << uintptr_t(ptr_d + 2) << endl; } 결과값은 아래와 같이 나왔습니다.int형 포인터 ptr_i의 크기는 8ptr_i가 참조하는 변수 자체의 크기는 4double형 포인터 ptr_d의 크기는 8 ------이하 ptr_i-------1번째 : 61244665680번째 : 61244665721번째 : 61244665762번째 : 6124466580 ------이하 ptr_d-------1번째 : 61244665440번째 : 61244665521번째 : 61244665602번째 : 6124466568 포인터는 결국 '주소를 담고있는' 변수에 지나지 않잖아요?x64 환경에서 포인터의 크기는 어떤 자료형을 가리키던 상관없이 8바이트인데, 그렇다면 ptr_i에서 -1, +1 연산을 수행하면 결과값들이 8씩 차이가 나야하는게 맞지않나요? 제가 이해한 바로는 (물론 잘못 이해하고 있겠지만..) 포인터는 변수니까, 해당 포인터를 담고있는 또 다른 메모리 공간이 있을거란 생각이 들어서요.
-
미해결[하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문
포인터 문자열 할당시 +1해주는 이유
안녕하십니까section2의 포인터와 배열/문자열 강의의 예시 중 ps = new char[strlen(animal)+1]; 부분에서 +1을 해주는 이유가 무엇인가요?null값과 관련되었다고 예상되는데 만약 그렇다면null값이 필요한 string과 달리 char형은 '\n'과 같은 null값이 없어도 된다고 알고 있습니다.1byte더 큰 크기 할당이 왜 필요한가요?
-
미해결홍정모의 따라하며 배우는 C++
int형 변수 배열에 대한 포인터에.....
int형 포인터에 int형 배열에 대한 주소를 넣고 포인터에 [0],[1] 을 입력하면 해당 배열에 대한 주소가 나오는 건가요?
-
미해결홍정모의 따라하며 배우는 C++
포인터 공부중 *와 &의 차이가 궁금해졌습니다!
강의 중char name[] = "jack jack;for (int i = 0 ; i < n_name ; ++i){ cout << *(name + i) }라는 코드가 있었는데*(name + i)를 &(name + i) 로 고치면 왜 안 될까요?*랑 & 둘다 같은 말이라고 생각했는데 혼란이 옵니다..ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터, 배열 관련 질문
이 부분에서 dest[j] = '\0';까지는 dest에 HelloWORLD라는 값이 저장되는데 return dest로 넘어가는 순간 Hello로 바뀌어서 왜 그런지 모르겠습니다.. 그리고 char* StrCat으로 함수를 만들지 말고 void StrCat으로 해도 똑같이 작동하나요??
-
미해결
c언어 입문자 포인터 관련 질문이 있습니다.
int main() { int num1 = 10; int num2 = 15; int temp =0; int *ptr1 =&num1; int *ptr2=&num2; temp = ptr1; ptr1= ptr2; ptr2 = temp; printf(" *ptr1 : %d , *ptr2 : %d,", *ptr1, *ptr2); } ptr1이 가리키는 변수와 ptr2가 가리키는 변수를 서로 바꿔 ptr2는 num1을 가리키고, ptr1은 num2를 가리키게 하는 함수를 만들어보았습니다. 물론 ptr1 = &num2; ptr2 = &num1; 이렇게 하는 간단한 방식도 있다는 걸 알지만, 어쩌다가 저 부분에 궁금증이 생겼는데, 위와같이 temp를 그냥 int temp = 0; 으로 선언하면 컴파일이 제대로 이루어지지 않지만, int *temp; 와 같이 포인터 변수로 선언하면, 문제 없이 작동하는 걸 확인하였습니다. 저는 포인터 변수를 선언하면, *ptr이라는 변수가 ptr에는 가리키는 변수의 주소가 상수로 저장이 되고, *ptr은 ptr이라는 변수에 상수로 저장된 주소에 접근하는 일종의 연산이라고 생각하였기에, ptr에 저장된 상수(주소값)을 int 형으로 선언된 일반 변수(temp)에 저장하고, 그것을 다시 다른 변수(ptr2)에 옮겨도 문제가 없을 것이라고 생각했는데, temp라는 일반 변수에서는 오류가 발생하고, *temp라는 포인터 변수에 저장을 해야만 제대로 작동하는 것을 확인하였는데 왜 *temp로 선언해야만 제대로 작동하는 지 이유가 궁금합니다..!
-
미해결홍정모의 따라하며 배우는 C언어
2차원 배열과 포인터 개념 질문이 있습니다.
float arr2d[2][4] = { {1.0f,2.0f,3.0f,4.0f},{5.0f,6.0f,7.0f,8.0f} }; float(*pa)[4]; float* ap[2]; pa = arr2d; 강의에서 코드가 이렇게 나오는데 여기서 개념이 헷갈리는게 있습니다. 1. float형 포인터변수 pa는 '원소가 4개짜리인, 이름도 모르는 어떤 배열을 가리키는 포인터 변수' 라고 생각했는데 이게 맞는지(맞다면 이 배열은 초기화를 안해줬으니까 쓰레기값이 들어가있는 건가요?) 2. pa에 arr2d배열의 첫 원소를 가리키는 주소를 넣어줬는데, 그럼 pa가 처음에는 쓰레기 값이 들어있는 배열을 가리켰다가 arr2d의 첫 번째 row(배열)를 가리키게 되는 건지(pa가 정확하게 뭘 가르키는지 조금 헷갈립니다.) 이렇게 질문이 있습니다. 도와주심 감사하겠습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터 기초#2 궁금한점입니다.
포인터 기초#2 강의에서 int 자료형인 number를 캐스팅을 이용하여 __int64 포인터 변수인 *ptr2로 집어넣고 *ptr2 에 0x0000AABBCCDDEEFF를 집어넣어서 메모리가 밀리는 현상을 보여주셨는데, number의 주소에 가보면 (number의 주소) : ccddeeff 한 칸 높은 주소 : 0000aabb 로 되어 있는 이유가 리틀-엔디안 방식이기 때문인건 알겠습니다. 근데 저장이 될 때 한칸 낮은 주소 : ccddeeff ( number의 주소) : 0000AABB 의방식으로 저장되지 않는 이유가 궁금합니다. 스택 프레임은 높은 주소에서 낮은 주소로 쌓이는 형식으로 되어있고, main함수 안의 변수도 스택 메모리를 차지하는 입장이므로 변수의 크기가 주소를 넘어가면 더 낮은 메모리에 저장되야 하지 않나요?
-
해결됨홍정모의 따라하며 배우는 C++
메모리 할당 해제 이후의 배열 원소 접근 문제
#include <iostream> using namespace std; int main() { const int row = 3; const int col = 5; // 복사할 2차원 배열 const int s2da[row][col] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; // twoDimArr의 row 배열을 가리킬 포인터를 초기화한다. int **twoDimArr{ new int *[row] {nullptr} }; // row 배열을 할당한다. for (int r = 0; r < row; ++r) twoDimArr[r] = new int[col] { 0 }; // s2da에서 twoDimArr로 복사한다. for (int r = 0; r < row; ++r) { for (int c = 0; c < col; ++c) twoDimArr[r][c] = s2da[r][c]; } // row 배열(twoDimArr[0...2])을 할당 해제한다. for (int r = 0; r < row; ++r) delete[] twoDimArr[r]; // ***************************************************************** int *ptr{ new int { 3 } }; delete ptr; //cout << *ptr << endl; // 오류 // row 배열 할당 해제로 인해 해당 배열의 원소를 접근할 수 없다. cout << **twoDimArr << endl; // twoDimArr[0][0] // ***************************************************************** // 2차원 배열(twoDimArr)을 할당 해제한다. delete[] twoDimArr; return 0; } (visual studio 2019에서 작성한 코드입니다.) 위 코드에서, ptr은 할당 해제 후에 접근하면 오류가 발생해 프로그램이 강제로 종료됐습니다. 그러나, twoDimArr의 row 배열들(twoDimArr[0...2])을 할당 해제하고 **twoDimArr 출력을 시도했을 때 프로그램이 종료되지 않았습니다. ptr처럼 할당을 해제하고 접근했다면, 프로그램이 비정상적인 종료를 해야하지 않나요? 게다가 intellisense에서 첫 번째 경우는 경고를 하는 반면에, 두 번째 경우는 그렇지 않네요. ps. 이렇게 사용하는 것은 올바르지 못한 것을 알지만, 생각과 다르게 실행된 이유가 궁금합니다.
-
해결됨홍정모의 따라하며 배우는 C++
6.9강을 듣다가 포인터로 실험을 해보았는데 이해가 안 가는 부분이 있어서 질문 드립니다
- 위 코드를 실행시켜 보았는데 이렇게 cout으로 원하는 출력값이 나오지만, stack around the variable a was corrupted라고 런타임 에러가 뜹니다. a가 int이니까 4바이트 크기이고, &a+1의 값이 위의 실행 결과와 같이 a의 주소와 4바이트만큼 떨어져 있으니까 아무런 문제가 없을 줄 알았는데 문제가 생겨서, 왜 문제가 생기는지 문의 드립니다.
-
미해결홍정모의 따라하며 배우는 C언어
구조체 포인터 선언의 기억공간 할당 여부
구조체 설계 struct guy { char favfood[10], char job[10] }; 일 때는 기억공간을 아직 할당받지 않은 상태이고 구조체 변수 선언 혹은 선언 동시 초기화 할 때 메모리에 공간을 할당받는다고 이해했습니다. struct guy barney; 이 때 기억공간을 할당받는다 포인터는 새로운 구조체를 생성하지 않고 기존의 동일 구조체를 가리킨다고 하셨는데, 구조체 포인터 변수는 구조체 포인터 변수 선언 시 메모리에 공간을 할당 받나요? struct person* someone; [정리]구조체 포인터 변수의 메모리 할당 시점이 궁금합니다.
-
미해결홍정모의 따라하며 배우는 C++
포인터 개념 질문드립니다
안녕하세요 교수님 바쁘신데도 직접 답변주셔서 감사합니다. 6.8의 12분14초에 궁금한게 있습니다. x86을 기준으로 ptr이 포인터이므로 저는 *ptr 과 *(ptr+4) 가 배열의 인접 값이라고 생각하였는데 *(ptr+1)이 다음값이 어떻게 되는건가요? 궁금해서 아래 코드로 써봤는데 각각 주소를 출력할때는 4차이가 맞는데 빼보니까 또 1이라고 합니다. 제가 어떤 개념이 잘못된것인지 궁금합니다. 감사합니다 #include <iostream> using namespace std; int main() { int array[5] = { 11,12,13,14,15, }; int* ptr = array; cout << *ptr << " " << *(ptr + 1) << endl; // +4를 해야 다음 index로 넘어갈것이라고 생각했는데 1로 넘어감 cout << (int)&ptr[1] << " " << (int)&ptr[0] << endl; //주소 차이는4 cout << &ptr[1] - &ptr[0] << endl; //차이를 찍어보면 1 return 0; }
-
미해결홍정모의 따라하며 배우는 C언어
포인터 연산자...에 대해 질문있습니다~~!
안녕하세요~ 포인터 강의 듣던 중 옳게 이해한게 맞나 궁금하여 질문드립니다! int a = 7; int* ptr = &a; >> Line2 *ptr = 8; >> Line3 여기서 Line2에서 사용한 * 과 Line3에서 사용한 *은 차이가 있는거같은데 명확하게 설명하라하면 못하겠네요;; Line3에서 사용한 *는 간접참조(역참조) 를 수행하는 '연산자' 라면 Line2에서 사용한 *은 마치 자료형처럼 쓰는건가요? 무슨 차이인지 궁금합니다~
-
미해결홍정모의 따라하며 배우는 C언어
배열과 포인터의 산술 연산
안녕하세요:) 연습 문제 구현 중, swap(&arr[min_idx], &arr[i]); 이 부분을 swap(arr + min_idx, arr + i); 이렇게 구현을 해봤는데, 똑같이 작동해 확인 차 여쭤보려고 질문을 달게 되었습니다. 전에 포인터는 산술연산이 가능하지만, 배열은 산술연산이 안된다고 하셨는데요. 여기서 arr은 배열이지만 산술연산이 가능한 것은 함수로 들어오면서 arr이라는 변수명이 포인터처럼 작동하기 때문에 가능한 것이 맞나요? 감사합니다:)
-
해결됨[하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문
참조변수 질문이요
참조변수는 어떤경우에 쓰는거고 포인터변수로 swap하는거랑 차이점이 뭔가요??
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터 산술연산질문있습니다!
int number = 1; int* ptr = 1; *ptr += 1; 이것을 실행하고 메모리를 봐봤습니다. 주소는 정상적으로 이동했는데 실제 number가 있는 주소는 변하지않더라구요. 포인터연산은 실제 값이있는 위치에는 영향이 없는건가요??
-
미해결[하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문
포인터의 연산
p3=p3+1 을 했을 때 p3[0]이 0.5를 가리키게 되고 p3[1]이 0.8을 가리키게 되는 원리가 잘 이해가 가지 않아요. p3주소가 1만큼 옮겨졌단 뜻인가요? p3에 포함된 배열들의 위치가 1씩 옆으로 옮겨졋단건가요?