월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C언어
배열의 이중포인터
안녕하세요학습중 개념에 혼동이 생겨 질문글을 남깁니다.강의는 10.13, 4분 18초 쯤입니다. 예컨대*(*(parr + 1) + 2)가 있다 하면 이것이 어떤 값을 나타내는지 그 과정 중에서 혼란스러운 부분이 몇 개 있습니다. 질문과 더불어 제가 잘못 설명하는 부분이 있으면 지적해주시면 감사하겠습니다. parr + 1는 포인터parr 배열의 2번 째 원소(arr[1])의 첫 주소, 즉 4의 주소를 가리키는 포인터입니다. 한편, *라는 기호는 포인터변수에 저장된 주소에 접근하여 그쪽에 저장된 데이터를 들고오는 역참조의 기능을 수행케 합니다. 그렇다면 *이 붙은 *(parr + 1)에서는 4의 주소로 접근하여 *에 의해 4라는 값을 역참조해오게 됩니다. 하지만 그러면 *(4 + 2)가 되는데 이는 전혀 말이 안 되고 본래의 +2는 포인터의 산술연산을 위한 것이기에 *(parr + 1)는 모종의 포인터가 돼야 하고 강의 중에서도 교수님이 그렇게 말씀하셨습니다.(제가 오해하고 있는 부분과 달리 가장 밖에 있는 *는 실제로 역참조의 기능을 가지는 것이 자명한데도요...) 그래서 정리하자면 *(parr + 1)는 어떤 주소를 나타내것인지 아니면 모종의 포인터를 의미하는 건지 궁금하며 그리고*(*(parr + 1) + 2)의 전체적인 플로우를 정확하게 이해하고 싶습니다. 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
디버깅 관련 질문
#include <stdio.h> #include <ctype.h> #include <stdbool.h> #define STOP '.' int main() { char c; int n_chars = 0; int n_lines = 0; int n_words = 0; bool word_flag = false; bool line_flag = false; printf("Enter text :\n"); while((c = getchar()) != STOP){ if(!isspace(c)){ n_chars++; } if(!isspace(c) && !line_flag){ n_lines++; line_flag = true; } if(c == '\n'){ line_flag = false; } if(!isspace(c) && !word_flag){ n_words++; word_flag = true; } if(isspace(c)){ word_flag = false; } } printf("Charaters = %d, Words = %d, Lines = %d\n", n_chars, n_words, n_lines); return 0; } 강의 내용 예제 코드인데 문자로 입력해야 디버깅이 가능한 예제 코드들은 어떻게 디버깅 하는지 알 수 있을까요??
- 미해결홍정모의 따라하며 배우는 C언어
디버거 사용법을 따라하다가 강의와는 다르게 진행되는 것 같아서 문의 드립니다...
브래이크 포인트를 표시하고 디버그스타트를 눌렀는데 강의처럼 안되어서 문의 드립니다.
- 해결됨홍정모의 따라하며 배우는 C언어
매개변수는 포인터, 함수 내에서는 배열?
안녕하세요강의 듣던 중 궁금한 게 생겨 여쭙게 됩니다.double average(double * data_array, int n) { printf("Size = %zd in function average\n", sizeof(data_array)); double avg = 0.0; for (int i = 0; i < n; ++i) { avg += data_array[i]; } avg /= (double)n; return avg; }(1)위의 코드에서 average함수의 매개변수로 포인터변수인 data_array가 들어와 있습니다. double * data_array를 arr1[]로 바꿔도 시스템은 이것을 arr1배열의 첫주소를 가지는 포인터변수 double * (배열명)로 인식한다는 것이 정확한 이해인가요? (2)average함수의 매개변수에 배열을 넣든 뭘 하든 시스템은 배열의 첫 주소를 가지는 포인터 변수로 읽어버립니다. 하지만 코드의 중간 쯤에 있는 avg += data_array[i];에서data_array[i]는 배열의 문법입니다. 물론, 예컨대 arr배열이 있을 때*(arr+10)와array[10]가 같은 요소를 가져온다는 것은 압니다. 하지만 average함수는 기존에 저희가 적은 배열의 정의를 못 만나봤고, 즉 알지 못하고 그 배열의 첫 주소만 가지고 있는 포인터변수만을 가지고 있습니다. 이 때 data_array[i]라고 작성하면 시스템이 이것을 내부적으로 *(data_array + i) 즉, (본 강의에서는 배열명이 arr1 이었습니다) *(arr1 + i)로 바꿔버리나요? 즉, 다시 말해 배열arr1 을 알지 못하고 배열arr1의 첫 주소값이 있는 포인터 변수만을 가지고 있는 함수 average가 어떻게 포인터 문법이 아닌 배열 문법을 쓰는지 궁금합니다. 긴 글 읽어주셔서 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
포인터 주소 대입
안녕하세요 int *a = &b;코드가 위와 같을 때는 변수 b의 주소를 포인터변수 a에 넣는 걸로 이해했습니다.int *a = 123;코드가 위와 같을 때도 포인터변수 a 에 123이라는 메모리 주소를 넣는다고 이해해도 될까요?
- 미해결홍정모의 따라하며 배우는 C언어
따배씨 4-2 4:38초 내용이 이해가 어렵습니다.
안녕하세요, 최근 따배씨 열심히 수강하고 있는 학생입니다.수강 중 교수님께서 말씀하신 부분의 이해가 어려워 질문 올려봅니다."다른 프로그램에서 sizeof가 우리에게 알려주는 값이 범위, 자료형이 unsigned int가 아닐 수 있어서 이식성을 높이기 위해 size_t를 사용한다." 라고 말씀하셨는데 어차피 size_t도 unsigned int 아닌가요?? 결국 unsigned int에 해당하지 않는 자료형이 들어오면 size_t도 sizeof와 다를 바 없다고 이해했는데, 혹시 제가 틀리게 이해하는 부분이 있을까요?? 있다면 가르침을 부탁드리겠습니다.
- 해결됨홍정모의 따라하며 배우는 C언어
10.6강 1번 문제 1차원 배열을 2차원 배열로 만드는 문제
double year2021[MONTHS] = { -2.4, 2.7, 9.0, 14.2, 17.1, 22.8, 28.1, 25.9, 22.6, 15.6, 8.2, 0.6 }; double year2022[MONTHS] = { -2.2, -1.1, 7.7, 14.8, 19.1, 23.3, 27.3, 25.7, 22.4, 14.6, 10.0, -2.8 }; double year2023[MONTHS] = { -1.5, 2.3, 9.8, 13.8, 19.5, 23.4, 26.7, 27.2, 23.7, 15.8, 6.8, 3.1 }; // 1. 1차원 배열을 2차원 배열로 구현 // 배열명의 값은 배열의 시작 주소와 같다. double* temperature[] = { year2021, year2022, year2023 }; printf("%zd %zd %zd %zd\n", sizeof(temperature), sizeof(temperature[0]), sizeof(*temperature[0]), sizeof(year2021) ); 1차원 배열(2021년, 2022년, 2023년)의 주소를 2차원 포인터 배열의 요소로 초기화했습니다.// 1. 1차원 배열을 2차원 배열로 구현 // 배열명의 값은 배열의 시작 주소와 같다. double* temperature[] = { year2021, year2022, year2023 }; 2중 for문의 내부 for문의 조건부를 지정할 때 sizeof 연산자를 이용해서 아래같은 방식으로 구현하려고 했습니다.size_t col = sizeof(temperature[0]) / sizeof[double]; for(int j = 0; j < sizeof(temperature) / sizeof(temperature[0]); ++j) { for(int i = 0; i < col; ++i) { // (j, i)번째 요소 출력문 } } 제가 생각한건 'temperature[0]에 저장된 값이 year2021의 메모리 시작 주소와 같으므로 temperature[0]의 값을 역참조하면 year2021 배열 전체를 가리킬 것이다' 였는데sizeof(*temperature[0]);이 값이 year2021의 0번째 double 요소로 역참조되서 그런지 결과값이 8로 잡혀서size_t col = sizeof(temperature[0]) / sizeof[double];col의 값이 1로 계산됩니다.. 어떻게 하면 temperature[0]을 이용해서 배열 year2021의 전체 길이를 반환할 수 있을까요..??
- 미해결홍정모의 따라하며 배우는 C언어
재출력이 안돼요.
파일에 저장할 텍스트를 입력하는 것까지는 문제가 없는데 while (fscanf(fp,"%s",words) != EOF) fprintf(stdout,"%s\n",words);이 문장이 제대로 실행되지 않는 것 같아요
- 미해결홍정모의 따라하며 배우는 C언어
warning이 안지워져요 3.4강의 21분
3.4 강의 21분 43초에 나오는 코드랑 똑같이 작성 하였는데scanf("%f", &Won); 여기에 Warning이 계속 떠 있어요Description은 Return value ignored: 'scanf'. 이렇게 나와 있습니다.선생님은 안뜨는데 왜 저만 떠있나요 버전의 차이인가요? _CRT Secure No Warnings은 properties에 입력해두었습니다. #include <stdio.h> int main(){float Won = 0.0f;float USdollar = 0.0f; printf("Input Won\n");scanf("%f", &Won); <<<<<<<<<<< 이 부분 USdollar = Won * 0.00089f;printf("USdollar = %f\n",USdollar);return 0;} Return value ignored: 'scanf'. 라고 떠있어
- 미해결홍정모의 따라하며 배우는 C언어
scanf & 버퍼
안녕하세요강의의 최종 코드 중 일부입니다.... printf("input one character and two integers:\n"); while ((c = getchar()) != '\n') { scanf("%d %d", &rows, &cols); while (getchar() != '\n') continue; display(c, rows, cols); ...여기서 A 3 2(엔터)를 입력하면 상단의 c=getchar()에 의해 getchar이 A를 가져가고 버퍼는 |A 3 2\n| 에서 | 3 2\n| 로 변하게 됩니다.(띄어쓰기 유의) 그다음 scanf("%d %d", &rows, &cols); 는 버퍼의 맨 앞의 띄어쓰기를 읽어야 하지 않나요? 그런데 아시다시피 scanf가 입력버퍼에서 읽는 것은 3과 2입니다. scanf가 띄어쓰기를 읽는다고 알고 있는데 3앞의 공백이 어떻게 처리된건지 궁금합니다. 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
10.2강 27:09에서 질문이 있습니다.
가변 길이 배열에 대해서 위키에는 길이를 런타임에 결정하는 배열(whose length is determined at run time (instead of at compile time).)라고 정의되어있는데요.https://en.wikipedia.org/wiki/Variable-length_array int main() { const int n = 8; int arr[n]; };제가 작성한 코드에서 n이 8로 초기화 및 상수로 되어 있는데 이건 컴파일 타임에 이미 배열의 길이를 결정해 놓은게 맞나요??오류가 나는 것은 비주얼 스튜디오의 컴파일러가 이 문법을 지원하지 않아서 일까요,,??
- 해결됨홍정모의 따라하며 배우는 C언어
포인터에 저장되는 주소값의 자료형
포인터 변수가 어떤 변수의 주소값을 저장한다는 것은 이해했습니다.그런데 메모리의 '주소'는 어떤 자료형에 속하나요?형식지정자 %p로 출력해보면 16진수로 나오는 것 같은데 정수형이라고 생각해도 될까요??
- 미해결홍정모의 따라하며 배우는 C언어
1.0625e0과 0.0625e0의 차이
안녕하세요. 강의의 23째 줄 코드를 제가 0.0625e0;로 바꾼 후 build를 해보니까 프로그램 마지막 출력에서 각각 아래와 같은 값이 나왔습니다. 0x1.0000000000000p-4 0X1.0000000000000P-4 저는 0.0625가 1/16이니 출력이 0x1.000...0p-1이나0x0.1000...0p+0일 줄 알았는데 p-4가 나와서왜 이러한 값이 나오는지 질문드립니다.
- 미해결홍정모의 따라하며 배우는 C언어
const int angel = 1004;에서 변수였던 angel이 기호적 상수가 되면
const int angel = 1004;에서 변수였던 angel이 const를 붙임으로써 기호적 상수(symbolic constant)가 되면 rename으로 다른 부분에 써놓았던 angel을 전부다 변화시키면 그래도 오류가 나나요? const를 붙인 자료형에서 상수를 바꾸면 오류가 난다고 봤었는데, 변수였던 angel도 고치면 오류가 나나요? 그러니까 angel이라는 이름을 못바꾸는건가요? 아니면 angel에 대입하는 1004라는 숫자를 못바꾸는건가요? 아니면 둘다 못바꾸는건가요?
- 해결됨홍정모의 따라하며 배우는 C언어
8.5강 2분 38초 관련해서 질문이 있습니다.
입력 "A 3 3 "에 대해입력 버퍼에 저장된 값은 "A 3 3 \n"이며"A 3 3" 까지만 읽고AAAAAAAAA를 출력한다는 것은 알겠습니다. 그 다음 입력 "B 1 2 "에 대해입력 버퍼에 " \n"이 남아있으므로입력 버퍼에 저장된 값은 " \nB 1 2\n"이며입력 버퍼에서 개행 문자(\n) 앞의 공백(" ")만 읽어오고나머지 rows나 cols는 이전에 저장된 값을 재사용해서3개씩 3줄의 공백을 출력하는 것 같습니다. 여기서 궁금한 점이..scanf의 첫 번째 인수로 공백(" ")을 읽고 나머지 rows와 cols는 읽지 못했는데 왜 그대로 진행되어 9개의 공백(붉은색 부분)이 출력되는건가요?? 링크의 문서에는 입력 스트림에 저장된 값이 형식 지정자와 다를 경우 scanf를 종료한다고 되어있습니다. 그러면 첫 번째 인수로 공백(" ")을 읽고 한 줄에 3개씩 3줄의 공백(" ")를 출력하고 난 뒤에는개행 문자 ("\n")를 읽어서 9개의 줄 바꿈이 출력되어야 할 것 같은데왜 바로 BB가 출력되었는지 잘 모르겠습니다.. [입력과 그에 대한 예상 출력 콘솔 화면] A 3 3 // 첫 번째 입력 : A 3 3 AAA AAA AAA // 한 줄당 3개의 'A'를 3줄 출력 B 1 2 // 두 번째 입력 : B 1 2 // 한 줄당 3개의 공백을 3줄 출력 // 9번 + 3번 총 12번의 줄바꿈 BBhttps://learn.microsoft.com/en-us/cpp/c-runtime-library/format-specification-fields-scanf-and-wscanf-functions?view=msvc-170 scanf를 실행시켜서 입력 버퍼의 값을 읽고 각각의 인수에 저장한 후에는 입력 버퍼에서 읽은 값을 제거하나요? 아니면 getchar처럼 스트림의 위치를 마지막으로 읽었던 값의 다음 위치로 이동시키나요?? 첫 번째 입력이 "A 3 3"이고 두 번째 입력이 두 번째 입력이 "B 1 2"일 때첫 번째 출력을 한 후 입력 버퍼에 저장된 값이 "\nB 1 2\n"인데scanf가 첫 번째 \n만 읽어서 12번 줄 바꿈 출력 후 종료되는건가요? 계속 구글링 해보고 있지만 답을 찾지 못해서 질문드립니다..
- 미해결홍정모의 따라하며 배우는 C언어
부호 있는 정수, 부호 없는 정수
예를 들어 8비트 2진수1010 1110 이 있을 때컴퓨터가 어떻게 맨 앞 비트가 부호비트인지 아닌지 아는 것인가요?양수 174가 될수도 있고 음수 -46이 될 수 있는데 컴퓨터가 어떻게 그것을 구분하는 것인지 궁금합니다..
- 미해결홍정모의 따라하며 배우는 C언어
gcc 오류 이유
왜 오류가 난건가요..?
- 해결됨홍정모의 따라하며 배우는 C언어
7.2강 06:06 질문이 있습니다.
char ch; ch = getchar(); // 1) while (ch != '\n') { putchar(ch); // 2) ch = getchar(); }; getchar와 putchar의 세부 동작 방식이 궁금해서 여쭤봅니다..IBM에서는 getchar 함수의 역할을 현재 스트림 위치의 문자 하나를 읽고 다음 스트림의 위치로 이동한다고 설명되어있는데 스트림의 위치라는게 버퍼의 인덱스를 말하는건가요??https://www.ibm.com/docs/ko/i/7.3?topic=functions-getc-getchar-read-character getchar는 입력 버퍼가 비어있을 때는 입력을 받지만, 입력 버퍼가 차있을 때는 입력 버퍼의 현재 위치의 값을 반환하고 다음 위치로 이동하는 함수라고 이해하면 될까요?? 디버거로 putchar의 동작을 확인했을 때는 입력 버퍼에서 맨 앞의 글자를 한 글자씩 출력하는 것 같은데 그러면 putchar는 버퍼를 사용하는 방식이 아닌건가요?? 이클립스에서는 Ctrl+우클릭 후 Open Implementation을 선택하면 라이브러리 함수가 동작하는 코드를 직접 확인할 수 있는 것 같은데 비주얼 스튜디오에서도 확인하는 방법이 있을까요..??
- 해결됨홍정모의 따라하며 배우는 C언어
6.17강 14:39분 평균을 구하는 예제 질문이 있습니다.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define SIZE 5 int main(void) { int numbers[SIZE]; int sum = 0; int i; printf("Enter %d numbers : ", SIZE); for (i = 0; i < SIZE; ++i) { scanf("%d", &numbers[i]); // &( numbers[i] ) : 배열 인덱스 역참조 연산 후 주소 연산 } for (i = 0; i < SIZE; ++i) { sum += numbers[i]; } printf("Sum : %d\n", sum); // 첫 번째 평균 출력식 Average 1) double average = sum / SIZE; printf("Average 1) : %lf\n", average); // 두 번째 평균 출력식 Average 2) printf("Average 2) : %lf\n", (sum / SIZE)); return 0; }위 코드에서 첫 번째 평균 출력식 Average 1)는 정상적으로 평균 3.000000을 잘 출력하는데두 번째 평균 출력식 Average 2)는 0이 출력이 됩니다..혹시 print 함수의 인수로 표현식이 들어가면 안되는걸까요??
- 해결됨홍정모의 따라하며 배우는 C언어
fgets() 함수 질문
안녕하세요.11-4 강의 듣고 궁금한 점이 있어 질문드립니다. 콘솔창에 문자를 입력할 때 eof 혹은 줄바꿈 말고 4글자를 입력하면 프로그램이 종료되는데, 이는 어떤 원리에서 종료되는 걸까요?