unit 70 질문이요!
, 김 상섭님이 작성unit 70
①
p.826 예제
char s1[10];
int num1;
FILE *fp = fopen("hello.txt", "r");
fscanf(fp, "%s %d", s1, &num1); 에서
s1은 앞에 &을 붙여서 &s1이라고 하지 않고
그냥 s1으로 하는 이유가 무엇인가요..?
배열 파트를 다시 찾아보아도 잘 모르겠습니다..
감사합니다.
②
p.838
70.6 연습문제: 파일에 문자열 쓰기
2번 정답이
fputs와 fwrite를 이용한 두가지 모두 다 가능하다고 하셨는데
fprintf는 되지 않는 이유가 그냥 연습문제 제목 자체가
"파일에 문자열 쓰기" 라서
서식을 지정하여 사용하는 fprintf는 되지 않는 것인가요??
매번 자세한 설명 정말 감사합니다.
많이 배우겠습니다.
Re: unit 70 질문이요!
, 도장_ 관리자님이 작성scanf나 fscanf는 모두 입력 받은 값을 저장할 주소를 인자로 받습니다.
C 언어 표준 따라 조금 다른데, restrict가 추가된 것의 차이.
85.16 restrict 포인터를 참고하면 됩니다.
대다수 C 언어 입문서는 restrict 포인터를 설명하지 않을 겁니다만, C99 표준 이후에는 기본 함수에서도 restrict 포인터로 바뀐 것이 많습니다. scanf, fscanf가 대표적이죠.
C99는 1999년 표준안이고, C11은 그 후에 나온 2011년 표준안입니다.
scanf에서 숫자 변수 앞에 &를 붙인 것은 주소를 전달하기 위한 것입니다. 포인터가 인자이니까요. 타입을 맞추기 위한 것이죠.
int a라면 &a로 지정해서 address of int로 전달해야 합니다. 그래야 주솟값을 전달할 수 있고, 포인터 인자가 처리할 수 있습니다. 타입을 일치시켜라. 입니다. address of와 pointer to는 같은 주솟값이라 호환됩니다.
배열 변수는 array of name인데, array of도 주솟값입니다. 따라서 포인터와 호환됩니다.
따라서 s1 이름만 쓰면 주솟값을 전달하는 것입니다.
s1[2]는 첨자 연산자이고, 첨자 연산자는 그 안에 선언된 요소의 타입입니다.
char s1[10]이면 s1[2]의 타입은 char입니다.
&s1으로 쓰면 address of array of s1이므로 이에 호환하는 타입은 pointer to pointer to인데, scanf, fscanf의 정의에는 이중 포인터를 받는 인자가 없습니다. 따라서 타입 미스매치이고 오류입니다. 오류는 에러이고요. C 언어 컴파일러는 구형일수록 오류로 컴파일하는 경우가 많습니다.
어쨌거나 숫자 입력 하나에도 메모리 개념, 포인터 개념이 필요한데 이걸 가르칠 수는 없으니 초반에는 숫자를 입력할 때 변수 앞에는 &를 붙여야 한다고 공식처럼 설명하는 겁니다. 이게 나쁜 것은 아닙니다.
원리가 이해가 안 되면 일단 많이 사용해보고 몸으로 배워라. 학습의 기본 원리입니다.
자전거 타는 법은? 넘어지고 페달 밟고 타 보면 됩니다. 자이로스코프 원리 학습하고, 캐스터 각 학습하고 자전거 타는 법을 배우는 사람은 없습니다.
공부하기 싫어 몸서리쳐질 때 '이것'부터 해보세요. 효과가 좋습니다 (박문호 뇌과학자)
코딩 테스트에서 배열 뒤집기가 나오고 어렵다면, 매일 아침 하루 한 번씩 배열 뒤집기 코드를 보고 따라 치면 됩니다. 100일 동안 하시면 됩니다. 그러면 그냥 외워지고 자동이고, 원리도 이해가 됩니다. 영상에서는 이해는 나중에 오는 거라고 설명합니다.
삽입 정렬이 어렵다면 매일 100일 동안 작성해보면 됩니다.
포인터가 어렵다면 매일 사용해보면 됩니다. 매일 그림으로 그려보면 됩니다. 영상에서도 시각적으로 이해하라고 합니다. 안 되면 몸으로 떼우시고, 코딩에서는 키보드 말고 종이와 펜으로 그림 그리세요. 그림 그리는 게 몸으로 떼우는 겁니다.
포인터가 어렵다면 매일 사용해보면 됩니다. 매일 그림으로 그려보면 됩니다. 영상에서도 시각적으로 이해하라고 합니다. 안 되면 몸으로 떼우시고, 코딩에서는 키보드 말고 종이와 펜으로 그림 그리세요. 그림 그리는 게 몸으로 떼우는 겁니다.
C 언어는 타입 매치, 타입 미스매치, 이것만 알면 되고,
array of와 address of는 주솟값이므로 pointer to와 호환된다는 것만 알면 됩니다.
이거 보세요.
함수 인자에 char*냐 char[]이냐는 오래된 논쟁입니다.
https://dojang.io/mod/forum/discuss.php?d=599&parent=1352
이거 읽으세요. 어차피 함수 인자 char[]로 선언해봤자 컴파일하면서 char*로 바꿔서 처리합니다.자꾸 이거 두 가지가 다르다고 주장하는 C 언어 입문서, 영상 강의 많이 있는데 다 버리세요. 베스트셀러들이 특히 심합니다.(C 언어 표준안을 기준으로 얘기합시다. 저자 개인의 주장 말고...)
이 글도 사이트 관리자(저자 아님)가 작성했습니다.
이 글도 사이트 관리자(저자 아님)가 작성했습니다.