inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

int (*pa)[4]와 int*pa의 차이

미해결

홍정모의 따라하며 배우는 C언어

#include <stdio.h> int main() { float arr2d[2][4] = { {1.0f,2.0f,3.0f,4.0f},{5.0f,6.0f,7.0f,8.0f} }; float(*pa)[4] = arr2d; printf("%u %u \n", (unsigned)pa, (unsigned)(pa + 1)); printf("%u %u\n", (unsigned)arr2d[0], (unsigned)arr2d[1]); printf("%u %u\n", (unsigned)pa[0], (unsigned)(pa[0] + 1)); printf("%f\n", pa[0][0]); printf("%f\n", *pa[0]); printf("%f\n", **pa); printf("%f\n", pa[1][3]); printf("%f\n", *(*(pa + 1) + 3)); float* ptr = arr2d; printf("%u %u \n", (unsigned)ptr, (unsigned)(ptr + 1)); printf("%u %u\n", (unsigned)arr2d[0], (unsigned)arr2d[1]); printf("%u %u\n", (unsigned)ptr[0], (unsigned)(ptr[0] + 1)); printf("%f\n", ptr[0][0]); printf("%f\n", *ptr[0]); printf("%f\n", **ptr); printf("%f\n", ptr[1][3]); printf("%f\n", *(*(ptr + 1) + 3)); } 강의 9:47에서 int(*pa)[4]가 나옵니다. 강의 10:20에서 교수님께서 pa는 4개의 float자료형을 가진 배열에 대한 포인터라고 하셨습니다. 저는 이것을 [4개의 float자료형을 가진 배열]의 배열에 대한 즉, 2차원배열에 대한 포인터라고 이해했습니다. float arr[4] = { 1.0f,2.0f,3.0f, 4.0f }; float(*pa)[4] = arr; Q1. 위처럼 (*pa)[4]에 1차원 배열도 넣을수 있는건가요? float(*pa)[4] 에서 [4]가 헷갈리는것같습니다. 정확히 정의를 내리기가 힘듭니다. float(*pa)[4] 란 무엇인가요? ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ pa는 어쨋든 그냥 단순한 포인터 변수 하나 라고 이해했습니다. 그래서 똑같이 float* ptr = arr2d; 포인터 변수를 하나 선언하고 거기에 2차원 배열([4개의 float자료형을 가진 배열]의 배열을 넣어줬습니다. 저는 pa 랑 ptr 은 그냥 외형만 다를뿐 문법적으로 같은 포인터변수라고 이해했습니다. 그런데 pa같은 경우 printf("%f\n", pa[0][0]); printf("%f\n", *pa[0]); printf("%f\n", **pa); printf("%f\n", pa[1][3]); printf("%f\n", *(*(pa + 1) + 3)); 이중포인터처럼 사용가능한 반면 ptr의 경우는 printf("%f\n", ptr[0][0]); printf("%f\n", *ptr[0]); printf("%f\n", **ptr); printf("%f\n", ptr[1][3]); printf("%f\n", *(*(ptr + 1) + 3)); 이중포인터처럼 사용하면 밑줄이 뜨고 오류가 떳습니다. 그림을 그려보니 ptr은 당연히 단순 포인터변수이기에 이중포인터처럼 사용은 불가능했습니다. Q2.그렇다면 어째서 pa는 포인터변수인데도 이중포인터처럼 사용이 가능한건가요? 또 pa와 ptr의 차이는 무엇인가요? 항상 감사합니다. 진짜 진짜 진짜 감사합니다.

  • c
CJS 댓글 2 좋아요 1 조회수 659

f20 에서 f15 + 1은 이해가 됩니다...

해결됨

IT 기업 취업을 위한: 코딩테스트 혼자서 정복하기 (C/C++)

다만, f15 에서 f10 +1 +1 / f12 +1 +1 은 이해가 되지 않습니다. 15원을 만들기 위해서는 10원을 만든 동전 개수에서 5원짜리 동전+1 만 하는게 맞지 않나요? 마찬가지로 f12도 12원을 만들기 위해서는 12원을 만든 동전개수에 3원짜리 +1만 하면 되는줄 알았지만 왜 f10 +1+1 / f12+1+1 인지 이해가 되지않습니다...

  • c
  • 코딩-테스트
푸푸 댓글 1 좋아요 0 조회수 382

2차원 배열에서의 주소

미해결

홍정모의 따라하며 배우는 C언어

#include <stdio.h> int main() { int arr[2][3] = { {1,2,3}, {4,5,6} }; printf("%u %u %u %u %u", arr+1 ,arr[1], &arr[1], &arr[0]+1, arr[0] + 1); return 0; } 강의 4:50 화면을 보면서 궁금한게 있습니다. arr == arr[0] == &arr[0]이고 arr+1 = &arr[1] == &arr[0]+1이므로 arr[0]+1또한 arr+1 = &arr[1] == &arr[0]+1과 같은 주소값을 출력할거라 생각했는데 arr[0]+1을 출력하니 &arr[0][1]이 출력되었습니다. Q1. 그 이유가 무엇인가요? 강의 3:18에서 arr[0]가 두번째 인덱스가 붙는 배열의 이름이라고 하셨는데 그러므로 arr[0]는 {1,2,3}의 첫번째 원소의 주소를 가리키는 포인터가 되고 arr[0] +1은 포인터연산에 의해 데이터 2의 주소를 가리키는 포인터가 되는건가요? 제가 제대로 이해한게 맞을까요? Q2. 그렇다면 2차원 배열 arr[2][3] = {{1,2,3},{4,5,6}}에서 arr은 {{1,2,3},{4,5,6}}의 첫번째 원소{1,2,3}의 주소를 가리키는 포인터인데 첫번째 원소가 {1,2,3}이므로 이중포인터가 되는것이고, arr[0]는 {1,2,3}의 첫번째 원소의 주소를 가리키는 포인터가 맞나요? 굉장히 헷갈리고 어지럽네요... 감사합니다.

  • c
CJS 댓글 2 좋아요 1 조회수 743

16진수에 대한 설명

미해결

홍정모의 따라하며 배우는 C언어

<3.8 8진수와 16진수> 강의에서 16진수에 대해 설명하시면서 unsigned int의 최댓값을 각각 10진수, 2진수, 8진수, 16진수로 나타내주셨습니다. 16진수의 표현에서 f가 8개인 이유는 16이 2의 4제곱이기 때문이라고 하셨는데 해당 설명의 메커니즘이 잘 이해가 되지 않아 질문드립니다. 수강 후 공부해본 결과, 2진수 1111이 16진수에서 f 하나에 해당하기 때문에, 해당 unsigned int의 최댓값인 2진수의 32비트는 나누기 4를 하여 16진수에서 8자리가 나타난다는 것은 이해를 하였습니다. 그러나 16이 2의 4제곱이라서 8개의 자리만 있으면 된다는 설명에 대해선 이해가 어려워 조금 더 구체적으로 알려주시면 감사하겠습니다.

  • c
  • 16진수
박정민 댓글 1 좋아요 1 조회수 877

왜 int, long, long long 타입의 변수에 최솟값을 할당하면 언더플로우가 아니고 에러가 발생하나요?

해결됨

홍정모의 따라하며 배우는 C언어

오버플로우를 확인해보고 언더플로우도 확인해보려고 최솟값을 할당한 후 값에 -1을 할 계획이었습니다. 그런데 최솟값을 할당하는 것 자체가 에러가 발생했습니다. 에러는 error C4146로 https://learn.microsoft.com/ko-kr/cpp/error-messages/compiler-warnings/compiler-warning-level-2-c4146?view=msvc-170 위의 사이트에서 설명을 참고했습니다. 그런데 위 사이트의 설명에 의한다면 char과 short도 최솟값이 할당이 안되고 에러가 나야할 것 같은데 char과 short는 최솟값도 할당이 잘 되고, 최솟값에 -1을 했을 때 언더플로우도 잘 발생(?)되었습니다. 혹시 왜 그런것인지 알려주실 수 있으실까요..?!

  • c
형씌 댓글 1 좋아요 1 조회수 433

gcc main.c 컴파일 안됨

미해결

홍정모의 따라하며 배우는 C언어

아예 다 지우고 다시 해봤는데도 gcc main.c 를 쳐도 오류만 뜹니다. shell창이 저는 cmd로 되어있는 것과는 관련이 없을까요? F1을 쳐서 shell을 쳐보았는데 강의에 나오는 것처럼 shell 종류를 바꿀 수 있는 것이 저는 뜨지 않더라고요. 전에 파이썬 배울 때 설정해 두었던 것이라서 어떻게 했는지 잘 기억이 안나요. 저것도 powershell로 바꾸는 방법도 알려주시면 감사할 것 같습니다.

  • c
sysong0102 댓글 1 좋아요 1 조회수 1506

임계영역 기반 동기화 질문입니다.

해결됨

Windows 시스템 프로그래밍 - 기본

안녕하세요. 시스템 프로그래밍 수업을 듣고 있는 수강생입니다. "임계영역 기반 동기화" 에서 질문이 있습니다. 해당 예제 코드는 ThreadFunc1과 ThreadFunc2가 경쟁적으로 SetString, GetString 하는 것을 CRITICAL_SECTION 으로 해결해보려는 예제로 인지했습니다. 그런데 main함수 초반에 hHandle에 ThreadFunc1쓰레드를 실행(_beginthreadex)하고 ::CloseHandle(hThread);를 했습니다. 저는 그래서 ThreadFunc1쓰레드가 종료되었다 생각하여 ThreadFunc1을 출력할 일이 없을거라 생각했습니다. 하지만 실행결과는 ThreadFunc1과 ThreadFunc2이 랜덤으로 5번 출력되는데 왜 ThreadFunc1이 출력되는지 궁금합니다. 혹시 제가 간과한 개념이 있을까요??

  • c
  • system-programming
  • vc++
bbangnaya 댓글 1 좋아요 0 조회수 384

1.11 명령 프롬포트의 기본적인 사용법 2분 42초쯤

미해결

홍정모의 따라하며 배우는 C언어

선생님이 보여주신 명령 프롬포트 화면이랑 제 노트북에 뜨는거랑 달라서요. explorer를 어디다가 붙여야 하는지 모르겠습니다.. 알려주세요

  • c
파이팅 댓글 1 좋아요 1 조회수 922

arr2d[2][4] 질문 있습니다

미해결

홍정모의 따라하며 배우는 C언어

float arr2d[2][4]; 가 있을 때 arr2d의 사이즈 자체는 32바이트이지만 arr2d는 메모리공간은 없는 float 4개짜리 배열의 포인터잖아요. 제가 잘못 배운 게 아니라면 뭔가 괴리감이 크게 느껴집니다. 그냥 받아들일까요?

  • c
donghun Kang 댓글 1 좋아요 1 조회수 336

13.1 파일 입출력의 작동원리 파일스트림

미해결

홍정모의 따라하며 배우는 C언어

파일 스트림도 버퍼를 사용하는 스트림이라는 말씀이신가요?

  • c
저스트두잇하는중 댓글 1 좋아요 1 조회수 511

24. 최솟값 구하기

미해결

문제로 배우는 C언어

int main(){ int i, min= 21470000, a; for(i=1; i<=7; i++){ scanf("%d", &a); if (a < min) min = a; } printf("%d", min); return 0; } 사용자가 입력 값을 5 3 7 11 2 15 17 와 같이 띄어쓰기가 포함된 입력 값을 입력하는데, 짜여진 코드에서는 띄어쓰기를 고려한 부분이 없는 것 같습니다. 이 부분에서 궁금한 점이 있는데, scanf("%d ", &a) 와 같이 d 다음에 띄어쓰기를 포함하지 않고 스캔을 받더라도 OS가 자동으로 띄어쓰기를 고려하여 입력 값을 처리하는 이유가 무엇인가요??

  • c
ksangyun04 댓글 1 좋아요 0 조회수 362

mingw-w64 설치 오류

해결됨

홍정모의 따라하며 배우는 C언어

아무리 여러 개를 시도해봐도 설치가 안됩니다ㅜㅜ mingw-w64 설치하는 해결방법이 있을까요? 현재 링크에 들어가면 강의에 나온 방법과 약간 달라진 것 같아요.

  • c
sysong0102 댓글 1 좋아요 1 조회수 1031

stdio.h를 include하지 않아도 printf가 실행되는 이유

미해결

홍정모의 따라하며 배우는 C언어

main.c에서도, my_print_functions.h에서도 stdio.h를 include하지않았는데 왜 printf("Hello!!hi!!bye!!")가 출력되는걸까요?? 감사합니다.

  • c
CJS 댓글 2 좋아요 1 조회수 956

파일 매핑 객체와 memcpy를 활용한 파일 복사 중, 왜 READ와 WRITE가 동시에 필요한가요?

해결됨

Windows 시스템 프로그래밍 - 기본

안녕하십니까, 윈도우 시스템 프로그래밍 강의 듣고 있는 학생입니다. 메모리 맵 강의에서 소개해주신 숙제를 수행하던 중에 접근 모드를 설정하는 부분에 사소한 의문이 있어서 질문드립니다. 작성한 코드의 흐름은 대략 다음과 같습니다. CreateFile() src파일과 dst파일의 핸들을 획득. GetFileSizeEx() src파일의 크기를 획득 SetFilePointer() dst파일의 크기를 설정, 2번의 값을 활용 CreateFileMapping() 각 파일의 매핑 객체 생성 MapViewOfFile() 각 파일 매핑 객체에 대한 포인터를 획득 memcpy() 각 파일에 대한 매핑 객체의 포인터와 파일의 크기로 파일의 복사 첫 시도에서 다음과 같이 1번과 4번을 수행했습니다. <실패> // 1번. dst 파일 생성 HANDLE hDst = CreateFile( TEXT("복사 대상 파일의 절대 경로"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); HANDLE hDstMap = CreateFileMapping(hDst, NULL, PAGE_WRITECOPY, 0, llFileSize.LowPart, NULL); if (hDstMap == NULL) { wprintf(L"Failed to create Dst file mapping obj [ERROR CODE: %d]\n", ::GetLastError()); CloseHandle(hSrcMap); CloseHandle(hSrc); CloseHandle(hDst); return 0; } 수행 결과, Dst파일에 대한 맵뷰 객체를 생성하는데 실패했고, ERROR_ACCESS_DENIED 에러 코드를 받았습니다. MSDN에서 CreateFileMapping()에 대해서 찾아본 결과, PAGE_WRITECOPY플래그가 PAGE_READONLY와 동일하다는 점을 확인하고 다음과 같이 수정하여 실행에 성공했습니다. <성공> HANDLE hDst = CreateFile( TEXT("복사 대상 파일의 절대 경로"), GENERIC_WRITE | GENERIC_READ, // 왜 GENERIC_WRITE만 설정하면 ERROR_ACCESS_DENIED인가요? 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); HANDLE hDstMap = CreateFileMapping(hDst, NULL, PAGE_READWRITE, 0, llFileSize.LowPart, NULL); if (hDstMap == NULL) { wprintf(L"Failed to create Dst file mapping obj [ERROR CODE: %d]\n", ::GetLastError()); CloseHandle(hSrcMap); CloseHandle(hSrc); CloseHandle(hDst); return 0; } MSDN에서 문제를 해결했지만, dst 파일에는 복사한 내용을 써넣기만 하는데 왜 dst파일에 대한 READ가 필요한지 의문이 들어서 이에 질문드립니다. 긴 글 읽어주셔서 감사드립니다.

  • c
  • system-programming
  • vc++
곽도훈 댓글 1 좋아요 0 조회수 506

9-8. factorial 예제

해결됨

홍정모의 따라하며 배우는 C언어

제가 factorial 예제를 제대로 이해했는지 몰라서 질문드립니다. #define CRT SECURE_NO_WARNINGS #include <stdio.h> long loop_factorial(int n); long recursive_factorial(int n); int main() { int num = 5; printf("%d\n", loop_factorial(num)); printf("%d\n", recursive_factorial(num)); return 0; } // (1) 반복문 factorial long loop_factorial(int n) { long ans; for (ans = 1; n > 1; n--) ans *= n; return ans; } // (2) 재귀 호출 factorial long recursive_factorial(int n) { if (n > 0) return n * recursive_factorial(n - 1); else return 1; } 해당 예시 코드에서 (2)번 재귀 호출 factorial 예제 과정에 대해 설명해보겠습니다. (1)처음 n에 argument 5가 대입되면, 0보다 큰 조건을 충족하므로 5 * recursive_fatorial(4)가 반환됩니다. (2)이후 recursive_factorial(4)가 실행되고, 역시 0보다 큰 조건을 충족하므로 4 * recursive_factorial(3)이 반환됩니다. (3)이 과정 끝에 recursive_factorial(0)은 조건을 충족하지 못해 1을 반환합니다. (4)그렇게 마지막에 반환된 recursive_factorial(0)부터 다시 역순으로 값이 반환됩니다. (5)1(f(0)) >> 1 * 1(f(0)) >> 2 * 1(f(1)) >> 3 * 2(f(2)) > > 4 * 6(f(3)) >> 5 * 24(f(4)) >> 120(f(5)) 의 순으로 값이 반환되어 결국 main() 함수에서 recursive_factorial(5)의 값은 120이 출력됩니다. 늘 친절한 답변 감사합니다.

  • c
이재완 댓글 1 좋아요 3 조회수 366

4.9 질문 있습니다.

미해결

홍정모의 따라하며 배우는 C언어

printf("%hhd %f", i, f); int i = 300; f=21.753241f라 했을 때 인자가 stack에 복사될 때 %f 부분은 왜 정상적으로 출력이 될까요? stack에 복사될 때 애초에 1바이트로 짤려서 복사가 되는 건가요?

  • c
donghun Kang 댓글 1 좋아요 1 조회수 327

ShellCodeSample03.c 질문 드립니다.

해결됨

독하게 되새기는 C 프로그래밍

강사님 항상 강의 잘 보고 있습니다. 질문이 있습니다. 예제에서 기계어를 배열에 담고 그 배열의 주소로 점프하게끔 되어있는데 강의에서 말씀하셨지만 배열은 데이터 영역에 있는데 어떻게 실행이 되는건가요? 무슨 기능을 끄면 가능하다고 하셨는데 이 예제엔 그 기능이 꺼져있는건가요?

  • c
  • kernel
  • secure-coding
김상현 댓글 1 좋아요 0 조회수 298

9-7. 재귀 호출과 스택 각 변수 주소 값 크기 차이 질문

미해결

홍정모의 따라하며 배우는 C언어

안녕하세요. 선생님께서 강의 후반부에서 실제로 stack에 쌓이는 것은 변수 뿐만 아니라 함수를 실행하기 위해 필요한 데이터들도 있다고 말씀하셨습니다. 이때 int 자료형 크기 이상(4 byte)의 차이를 보인다고 말씀하셨는데, 이 차이는 각 주소 값들을 비교한 것인가요? 그게 맞다면 제 출력값 기준으로 각 주소값들은 256의(10진수 기준) 차이를 보이던데, 이것은 1byte정도의 크기가 아닌가요? 늘 친절한 답변 감사합니다.

  • c
이재완 댓글 1 좋아요 3 조회수 338

인기 태그

인프런 TOP Writers

주간 인기글