C언어 썸네일형 리스트형 C언어 동적 메모리 할당(2) 드디어 완강이다! 마지막 수업!!! *추가) malloc은 기본적으로 void 형으로 할당 되어지기 때문에 내가 원하는 형으로 변환 시켜주는 겁니다. float이 필요하면 (float *)로 해주고 int가 필요하면 (int *)로 형 변환 시켜주는겁니다. 이렇게 형변환을 안해주면 컴퓨터 입장에서는 무슨 형으로 쓸 지 모르기 때문입니다. -> 그래서 형변환을 앞에 무조건 써야한다! 밑에 예제도 보면 int**로 형변환했다! ㅎㅎ 구조체 동적 메모리 할당을 포인터 변수로 선언하면 보통 p.number 이런식으로 가능했는데 p->number 이렇게 가능해진다. 그래서 메모리 공간에 struct Book 2개 공간만큼 선언하고 주소 2개에 1,2번 다 할당하고 showBook 함수로 출력하게끔 나타냈다. 와 .. C언어 동적 메모리 할당 여기부터는 내가 잘 모르는 문법이다 ㅠㅠ 학부때도 여기까지 안나가봐서.. 일단 강의들은거로만 쓰자면 pi = (int *)malloc(sizeof(int)); 여기서 (int *)이 형변환이다 malloc은 메모리에 할당할 수 있게 하는건데 sizeof(int)여서 int = 4byte가 할당된다. 메모리에 4byte가 있다는 소리!! 그래서 *pi = 100; 을 넣고 free()로 반환을 시켜야한다. 그래서 free(pi); 가 있는 것 ! 이게 C++에서는 new랑 delete로 바뀐다고 한다 ㅎㅎ 나는 C++을 미리 공부해가지고 malloc이랑 free가 뭔지 엄청 궁금해했었다. 고민 해결 휴우!! #include 은 동적 메모리 할당 malloc을 불러오기 위해서 사용한다! 음 하나씩 보자면 c.. C언어 구조체의 활용(2) 구조체는 같은 구조체라 하더라도 비교가 힘들다. 그래서 이런식으로 구조체 비교 구문을 쓰는데 논리 연산을 써서 사용한다. (p1.x == p2.x) && (p1.y == p2.y) 와 같이! 그리고 main에 쓰지 않고 밖으로 함수를 빼서 사용한다. 그래야 간결하고 알아보기가 쉽다. 주석 달린 것처럼 하면 안된다! 논리연산이랑 구조체 안의 point 변수를 이용해서! 메인이니까 comparePoint(p1, p2);를 한다! 이거는 이제 내가 직접 VS해서 한거다. 이게 버전업 돼서 그런지 (VS2022쓰는중) 그냥 scanf하면 오류난다 .. #pragma warning(disable:4996) 이거 넣어줘야함.!! 그리고 문자열 또한 포인터이기 때문에 (배열이라) scanf에서 & 빼준다! 저번이랑 .. C언어 구조체 이번 시간은 구조체에 대해서 배울 것이다!! 사실 구조체는 C++에서는 클래스와 매우 유사하다. 기억을 더듬어보면... 구조체보단 클래스를 엄청 썻던 기억이!!! 여기서 보면 알 수 있듯이 struct studnet는 구조체이다. 그래서 이거를 변수 s로 할당시키고 s.number으로 구조체에 있는 number에 넣는다. 그리고 strcpy로 홍길동도 넣고 하면 잘 나오는 걸 확인할 수 있다!!! %s는 문자열 그대로 받는것이고 %lf는 double형일때 쓰인다. *float은 %f로 쓰인다. scanf에서 근데 보면 number나 grade는 & 주소값 따른는데 name은 주소값이 아니라 그냥 입력이어서 s.name을 쓴 것을 알 수 있다. 이거 좀 주의해야 할 듯!! 이렇게 나온다 ㅎㅎ 다음은 두 점.. C언어 문자열 영어 - 1byte 한글 - 2byte Char array[10]; 영어:10글자 한글:5글자 배열은 내부적으로 포인터와 아주 흡사! \0은 Null이다! 즉 이게 무슨 소리냐 하면 배열에서는 끝에 무조건 Null이 들어가게 되있다. 그래서 gets(input); 에서 문자를 입력받고 (엔터누르기 전까지 계속 입력받는다 왜? char input[1001]로 1001글자까지 선언할 수 있기 때문에. 그래서 count를 0으로 초기화하고 Null인 \0 만나기 전까지 count를 증가시켜주는 것이다. (!=는 Not Same의 의미이므로) 즉, 쉽게 말해서 0,1,2,3,4번지까지 다 H,E,L,L,O 값인데 나머지 5~1000번지까지 Null이 된다. 그러면 당연히 문자열의 길이는 HELLO의 경우 5가 .. C언어 포인터 C언어의 꽃 포인터다! 내가 학부 1학년때 C언어를 배우다가 포인터에서 막혔는데 졸업하고 1년 지난 지금 정보처리기사 공부를 하면서 포인터를 완.전.이.해 해버렸다 그때는 왜 몰랐지?? 흐음... 어찌보면 내가 제어과여서 코딩의 중요성을 간과했을지도 모른다.. 오히려 컴공이었다면 엄청 팠겠지.. 다만 지금은 이제 아예 이 길로 가려고 마음을 먹어서 완전한 공부를 지향하고있다. 대표적인 swap을 포인터를 사용해서 하는 것이다. 이게 주소 참조였나? 그거였을 거다 아마 void swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } 이러면 스왑 끝이다! 교환 !! 참고로 &는 주소 불러오는 것이라 *인 포인터와 찰떡궁합을 맞아야한다. 값을 넣게.. C언어 다차원 배열 구구단을 예제로 들어보자 1차원 배열같은 경우 세로로 쭈욱 나열된다고 생각하면 쉽다. 그리고 2차원 배열은 가로로 쭈욱 나열돼서 이것들이 곱해지면 구구단이 되는 것이다. int gugudan[10][10] 같은 경우 0~9번지, 0~9번지를 나타낸다 즉 이게 0번지 안에서 0~9번지가 있다는 소리다 (2차원 배열) 근데 구구단은 0곱이 없으니까 사실상 1부터 시작한다고 보면 된다. 나는 아직도 좀 놀라운게 gugudan[i][j] = i * j; 같은 발상이 정말 배우면서도 좀 놀라운게 있다. 이걸 처음에 누가 생각한걸까 ?? 저 코드 한 줄로 구구단의 90%를 만들어버리니.. 대단한 것 같다 다음은 학생 점수의 총합이다. 여기부터 이해가 좀 가기 힘들었다. 우선 int total[2] = { 0, };.. C언어 배열 이번 시간은 배열에 대해서 공부할 것이다. 배열? 이미 알고있는데 왜 또 쓰냐면 이게 굉장히 중요하다. 배열 자체가 그냥 넘사벽으로 엄청 중요함!!! 한번 더 아는것도 나쁘지 않다. 우선은 여기서 순서를 알기위해 index 변수를 넣었다. C언어에서는 #define NUMBER 숫자 이런식으로 배열을 마니 한다고 한다.. (동빈나님이 그러심) 즉 여기서는 0부터 4번지까지 있다는 소리고 최댓값을 찾기 위해 max < array[i]를 했다. 이게 무슨 말이냐면 내가 30 34 72 35 90을 썼다고 치면 하나씩 비교를 처음에 for문 돌면서 해야할 것이다. 처음 max는 0이니까 30이 더 크므로 array[0]의 값이 max에 들어가고 또 index는 순서를 또 알아야 하니까 0이 들어간다. 이거를 .. 이전 1 2 다음