조무위키
조무위키
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보
행위
문서
토론
편집
역사 보기
C언어
편집하기 (부분)
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
===배열=== ---- 아까 설명했던 변수는 값을 보관하기 위한 공간이라고 말했는데, 그 공간을 여러개를 나열한 것을 배열이라고 보면된다. 내가 예를들어 int a; 라고 적으면 정수를 보관하기 위한 공간이 생기고 그 공간을 a라고 하는데 예를들어 여기에 30명의 학생들 성적을 보관한다고 치면 int grade1,grade2,grade3,grade4...grade30; //실제로는 ... 치면안되고 일일이 끝까지 적어야한다. 이렇게 일일이 전부 적어야하는 노가다,시간낭비하는 좆병신같은 상황이 연출되는데 그럴때 쓰는게 배열이다 위에서 변수를 30개 만들때 일일이 다쳤다고하면 배열은 int grade[30]; 이거 하나로 끝난다. [와 ] 사이에 30이 적혀있는걸 볼 수 있는데 왠만한 병신이 아니고서야 만들고자 하는 변수의 갯수란걸 알 수 있다. 이렇게되면 int형 변수 30개가 만들어지는데 점수를 넣고자 하면 grade[0] = 73; // 변수에 접근하고자 할때는 [와 ] 사이에 첨자 (나열된 변수의 번호 개념,index) 를 적어서 거기에 대입하면 된다 주의할 점은 '''첨자는 0번부터 시작한다 그리고 29번까지 사용한다.''' 즉 처음에 변수 선언할때 적은 0 ~ 첨자 - 1 까지 쓰는 것 이다. 참고로 변수 선언시에는 [ 와 ] 사이에는 '''무조건 상수'''만 들어갈 수 있다 변수 안된다. 위에 설명한것 처럼 변수 선언할때 첨자를 적어서 만들어진 배열을 정적 배열이라고 한다. 정적 배열의 단점은 변수 갯수를 변수 선언할때 무조건 정해야 하므로 만약 갯수가 딱 맞지 않는다면 공간 낭비 혹은 공간 부족 등의 문제가 있을 수 있는데 이를 해결하는 것이 바로 동적 배열이다. 예를들어 학생 성적 기록 프로그램을 만든다고 하자. 학생이 29명인지 30명인지 31명인지 모르므로 정적 배열일 경우 많이 만들어놓고 필요한 공간만 쓸 수 밖에 없는데 그렇게 되면 남는 공간은 만들어진 채로 썩어가게 되는데 동적 배열을 사용해 임의의 공간을 할당하고 해제 하여 사용할 수 있다. 사용법은 조금 어려워 보일 수 있는데 stdlib.h 를 include 한다음 <nowiki>int *grade = (int*) malloc( sizeof(int) * students);</nowiki> 하면 students 변수의 값만큼 int형 변수를 만들 수 있다. 위 malloc함수는 바이트 수만큼 메모리를 할당하여 주소를 반환해주는데 이 때 반환해주는 자료형이 void* 이므로 캐스팅연산자 즉 (int*)를 앞에 적어 준다. grade 옆에랑 (int*) 에 붙은 *가 뭔지 모를텐데 그냥 해당 자료형을 가르키는 주소를 보관하는 자료형이라 보면된다. 약간 비약을 섞어 말하자면 *가 안붙으면 값을 보관하고 *가 붙으면 주소를 보관한다고 보면 된다. 자매품으로 ** 도 있는데 이건 주소를 보관하는 변수의 주소를 보관하는 변수다. <nowiki>*</nowiki>의 갯수에 따라 n차 포인터라고 한다. 포인터 항목에서 다시 설명하겠다. 아무튼 저렇게 선언하고 평소대로 grade[0] = 30; 이런식으로 쓰면된다. 배열이 중요한 이유는 선언의 간편함도 있지만 관리가 매우 유용하기 때문인데 예를들어 배열 없이 학생성적을 전부 출력하려고 한다면 printf(<nowiki>"1번 학생 점수 : %d \n",grade1); </nowiki> printf(<nowiki>"2번 학생 점수 : %d \n",grade2); </nowiki> ... printf(<nowiki>"30번 학생 점수 : %d \n",grade30); </nowiki> 같은 개떡같은 상황인데 개쩌는 배열은 다 좆까고 반복문 사용해 2줄이면 된다. int i; for(i=0;i<30;i++) printf(<nowiki>"%d번 학생 점수 : %d \n",i+1,grade[i]); </nowiki> ㄴ TMI지만 1줄로도 된다. for(int i=0; i<30; i++) printf(<nowiki>"%d번 학생 점수 : %d \n", i+1,grade[i]); </nowiki> 반복문을 사용해 i를 증감시키면서 printf문을 30번 반복하고 grade 첨자 안에 증감되는 i를 넣어 0부터 29까지 전부 접근해서 출력할 수 있다. 아까 첨자에 변수넣는거 안된다고 하지않았나 하면 다시봐라 변수 선언시에만 상수로 만드는거다. '''그리고 그 배열을 free함수로 할당해준 메모리를 해제 해줘야한다. ( 하는법은 free(grade); )''' 이 밖에 특이한점은 char 자료형의 배열인데. char이 문자형 이였지만 배열일 경우에는 문자열 이라고 한다. 문자형과 문자열의 구분은 <nowiki>'와 ' "와 "</nowiki> 인데 printf 함수 안에 문자열을 넣은걸 보면 쉽게 알 수 있다. char ch = 'a'; char string[10] = <nowiki>"abcdefghi"</nowiki>; 이렇게 차이가 존재한다. 문자열을 선언 할 때는 <nowiki> "문자열" </nowiki> 이렇게 적어서 초기화 할 수 있는데. 정작 대입할때는 안된다 예를 들자면 char string[10] = <nowiki>"hello"</nowiki>; // 이건 된다. string = <nowiki>"bye"</nowiki>; // 이건 에러난다. 그리고 주의할 점이 있는데 문자열은 맨뒤에 \0 즉 널문자가 붙는다. '\0' == (char)0 컴퓨터의 입장에서 C의 문자열은 단지 메모리에 쭉 늘어선 숫자들일 뿐이기 때문이다. 문자열 관련 함수는 자신이 처리해야할 문자열과 건드려서는 안 되는 다른 데이터를 구분해 줄 표식이 필요한 것이다. 아무튼 널문자가 붙으므로 한 자리를 비워둬야한다. 예를들면 첨자에 10넣어서 배열 선언하면 문자열은 9개의 문자만 사용해야한다. 참고로 한글은 2byte이므로 9개가 아니라 4개밖에 못쓴다. 알파벳은 1byte 맞는데 한글이나 특수기호는 아니다. 위에 사용함으로써 얻는 장점들을 꼽자면 1. 다수의 변수 선언이 매우 용이하다. 2. 같은 용도의 많은 변수 관리가 매우 편해진다. 3. 위의 2가지를 해결함으로써 반복적 코딩을 줄이고 동적 배열로 메모리의 효율적 사용도 가능해진다. 배열은 arr[첨자] 로 각 첨자에 있는 변수에 대한 접근이 가능하다 설명했는데 이러한 접근도 가능하다. <nowiki>*(arr+0) = 3;</nowiki> 위 구문은 <nowiki>arr[0] = 3;</nowiki> 과 결과적으로 똑같으며 위의 구문을 이제부터 알 수 있도록 C 입문자들이 그렇게 혐오한다는 포인터에 대한 설명을 하겠다.
요약:
조무위키에서의 모든 기여는 CC BY-SA 4.0 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
조무위키:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)