코드블럭으로 C배우는 잼민이 입니다.
int A;
char A{10};
scanf("%d", &A);
scanf("%s", A);
라고 하면 왜 문자열 저장하는 데에는 &<===게 안 들어가는 지 모르겠습니다. 구글로 찾아봤는데
제가 이해한 사항으로는
&
이 표시는 주소를 나타내는 것으로 &A라고 하면 A 이름으로 저장된(또는 저장될) 데이터의 주소를 나타내는 것이다.문자열 입력받을 때 쓰지 않는 이유는 배열의 이름 자체가 주소를 나타내기 때문이다.
아....그렇다면 말이죠, 굳이 문자열만 저렇게 이름 자체가 주소를 나타내도록 하지 말고, 그냥 정수값이던 실수값이던 번거롭게 &빼먹어서 오류 나게 하지말고 문자열같이 이름 자체가 주소를 나타내도록 하면 않되나요?
문자열은 되고, 왜 정수형이나 실수형은 안되는 건지 모르겠네요. 심지여 숫자배열도 입력받으려면 &게 들어가야 하더군요...
코드블럭이 뭐지...요세는 그런걸로 코딩하는가...;;
에...혼자 배우는 거라. 무거운건 육체만으로 충분해서T..T 가벼운 IDE를 찾다보니 VS말고 이걸 쓰게 되었습니다.
뭔가 예제부터 엄청어렵게 적으셨네요. int A; char B[10]; 이런식으로 변수명좀 다르게해주세요. 우선 정확힌 문자든 실수든 배열로하면 배열이름자체가 주소입니다. 문자만 주소가 되는게 아니에요. int A[10]; char B[10]; printf("A : %d, \n B : %d", A, B); 요렇게 출력해보시면 둘다 각변수의 주소값이 나옵니다
아...그렇군요...감사합니다...
드디어 포인터의 세계로 오셨군요. 환영합니다. "문자열 입력받을 때 쓰지 않는 이유는 배열의 이름 자체가 주소를 나타내기 때문이다." <- 맞습니다. 이 이유 때문입니다. "아....그렇다면 말이죠, 굳이 문자열만 저렇게 이름 자체가 주소를 나타내도록 하지 말고, 그냥 정수값이던 실수값이던 번거롭게 &빼먹어서 오류 나게 하지말고 문자열같이 이름 자체가 주소를 나타내도록 하면 않되나요?" <- 가능합니다. 이미 이걸 위해 정의된 문법이 있습니다. 예를 들어 int형 변수를 선언하실 때. int A라고 선언하면 A의 값은 "값"이지만 int* A와 같이 *을 넣어서 선언하면 A의 값은 이제 주소를 나타냅니다.
값이 아닌 메모리 주소를 참조하는 변수를 "포인터 변수"라고 부릅니다. 일반 변수로는 int A; scanf("%d", &A); printf("%d", A); 위와 같이 작성됩니다. A는 "값"을 의미하고 scanf 함수는 입력받은 값을 메모리상 "어디에" 적어야 하는지를 받기 때문에 변수 A에 값을 저장하고 싶으면 &A로 A의 주소를 주는 것이지요. 만약 포인터 변수를 쓴다면 같은 구조를 아래와 같이 써야 합니다. int* A = malloc(sizeof(int)); scanf("%d", A); printf("%d", *A); 한 줄씩 설명 드리겠습니다. int* A <- A라는 이름의 포인터 변수를 생성하라는 뜻입니다. A는 값이 아닌 메모리 상 주소를 가리키며 이 메모리 주소에는 int형의 크기만큼 공간이 할당되어 있을 거라는 뜻입니다. int* A = malloc(sizeof(int)); <- malloc 함수는 메모리 상에서 주어진 용량만큼 메모리를 잡아서 그 "주소"를 반환합니다. sizeof(int)는 int형의 크기가 몇인지 반환합니다. 따라서 이 구문은 메모리 상에서 int 형 크기만큼 공간을 잡아서 그 주소를 A라는 포인터 변수에 저장한다는 의미입니다. scanf("%d", A); <- 아시 듯이 콘솔에서 정수형으로 입력받아 A가 저장하고 있는 메모리 주소에 쓰라는 얘기입니다. printf("%d", *A); <- A앞에 붙은 *은 A가 저장하고 있는 메모리 주소가 아닌 그 주소에 저장된 "값"으로 읽겠다는 의미입니다.
그러고보니...교제 다음장에 Chapter 09 '배열과 포인터' 라고 나오는데 ....-..- 질문만 보고 어찌 아신거지 ... 권해주신 교제는 잘 보겠습니다. 아직 오질 않아서-..-
지금은 문법이 그렇구나 하고 넘어가시는 것이 좋습니다. 변수의 값과 주소에 대한 개념에 대한 것은 '포인터' 챕터에서 상세하게 다룰 것입니다. 포인터는 C를 공부하는데 가장 큰 고비중의 하나이며, 포인터를 이해하고 능숙하게 다룰 줄 알아야 C를 할 줄 안다고 할 수 있습니다. 포인터는 C가 메모리 주소에 접근하는 방법이며, C#, JAVA 같은 언어와 달리 로우레벨 엑세스가 가능해 지도록 해줍니다.
...예전에 VB 6.0 배울때는 '와, 혼자서 하는데 막 창이 뜨고 계산기도 만들고, 그림판도 만들수 있네?! 프로그레밍 개꿀! 나 좀 천재인듯' 했었습니다. 데니스 리치가 아직 살아있었으면 F-word 메일을 보냈을 텐데... 답변 감사드립니다.
정확히 이해하려면 메모리 할당까지 가야 어느정도 이해가 될 수도 있는데, 아직은 그냥 문법이 거지 같구나 하고 넘기세영 ㅎㅎ
그냥 문법이 거지같은 걸로 생각하겠습니다. 제가 멍청한게 아닙니다.
정적 메모리 단계에서는 이해하기 힘든 부분입니다. 그냥 이런 문법 이구나 하신 다음에 동적 메모리 할당을 시작 하시면서 다시 한번 보시면 이해가 편하실 겁니다.
다시 봐야 하다니T..T 답변 감사드립니다.
극단적으로 말하면 포인터 역할이 동적 메모리 사용을 위한거라...
포인터 개념은 처음에 워낙 잡기 어렵다보니... 힘내세요
vs code가 가벼운ide입니다..이클립스보다도 오류없고 가볍고괜찮습니다
감사합니다.
Implicit conversion임. Char array인 A는 컴파일러가 암시적으로 &A[0]으로 바꿔서 넣어 줍니다.