본문 바로가기

Programming/C

(20)
C 언어 | 포인터 학습 목표 포인터 변수를 정의하고 사용할 수 있다. 포인터 C에서는 포인터 개념을 통해 변수의 주소를 쉽게 저장하고 접근할 수 있게 한다. 지난 글에서 배운 '*'연산자를 사용해서 프로그램을 만들어보자. #include int main(void) { int n = 50; int *p = &n; printf("%p\n", p); printf("%i\n", *p); } 위 프로그램을 보면 *p라는 변수에는 &n값, 즉 변수 n의 주소를 저장한다. int *p에서 *는 이 변수가 포인터임을, int는 이 포인터가 int 타입의 변수임을 가리킨다. 첫 번째 출력 값을 보면 p는 형식 지정자 %p를 사용해 변수 n의 주소를 출력한다(= 포인터 p의 값). 두 번째 출력 값을 보면 *p는 형식 지정자 %i를 사용해..
C 언어 | 메모리 주소 학습 목표 16 진법을 읽고 쓸 수 있다. 메모리 주소에 접근하고 값을 받아오는 코드를 C로 작성할 수 있다. 16진수 컴퓨터 과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많다. 2개의 16진수는 1byte의 2진수로 변환되기 때문에 정보를 표현하기 유용하다. 16진수를 표현할 때는 앞에 '0x'를 붙인다. 16진수는 10에서 15까지를 a에서 f로 대입해서 사용한다(대소문자는 구별하지 않는다). 15는 0xf, 16은 0x10인 식이다. 메모리 주소 정수형 변수 n에 50이라는 값을 저장하고 메모리상의 주소를 출력하는 프로그램을 만들어보자. '&'는 메모리상의 주소를 받기 위한 연산자이다. * 자료형 int는 메모리에서 4바이트 만큼의 자리를 차지한다. #..
C 언어 | 왜 배열을 선언할 때 상수 변수값을 크기로 지정할 수 없을까? 문제 상황 프로그램을 짜던 중 배열의 크기가 자주 사용될 것 같아 전역 변수로 상수 변수값인'const int NUMBER_IN_ARRAY = 5'를 선언했다. 그리고 main함수 내에서 배열을 선언할 때 그 크기 값을 NUMBER_IN_ARRAY로 지정했다. 컴파일을 하니 바로 컴파일 에러가 났다.(variable-sized object may not be initialized) 왜 배열을 선언할 때 상수 변수값을 크기로 지정할 수 없을까? 원인 파악 우선 배열의 선언 방법을 다시 알아봐야 한다. C/C++에서 배열은 선언할 때 크기가 지정되어야 한다. 이때 대괄호 []를 사용하는데, 크기는 고정된 상수여야 하며 변수는 사용할 수 없다. 내가 사용한 const int도 결국 초기값을 변경할 수 없는 변..
C 언어 | 명령행 인자 ✔ 학습목표 명령행 인자를 받는 프로그램을 c로 작성할 수 있다. 명령행 인자 명령행 인자(command line arguments)는 사용자가 명령행에서 명령을 실행할 때 해당 명령과 함께 지정하는 인자를 의미한다. 명령행 인자는 자동으로 프로그램의 main함수에 전달된다. 이제껏 당연하게 int main(void)라 써왔던 main 함수를 생각해볼 때다. main도 그 형태를 보면 하나의 함수다. 즉 사용자 정의 함수처럼 입력값과 출력 값을 가질 수 있다는 것이다. #include #include int main(int argc, string argv[]) { if (argc == 2) { printf("hello, %s\n", argv[1]); } else { printf("hello, world\..
C 언어 | 문자열의 활용 ✔ 학습목표 문자열을 탐색하고 일부 문자를 수정하는 코드를 구현할 수 있다. 문자열의 길이 및 탐색 사용자로부터 문자열을 입력받아 한 글자씩 출력하는 프로그램을 만들어보자. 한 글자씩 출력해야 하기 때문에 출력에 있어서는 루프를 사용해야 할 것이다. 그렇다면 문자열의 끝은 어떻게 알 수 있을까? 한 가지 방법은 지난 강의에서 배운 대로 널 종단 문자(\0)를 이용하는 것이다. s라는 문자열이 있다고 할 때 for(int i = 0; s[i] != '\0'; i++){...} 과 같은 루프를 사용하는 것이 그 예이다. #include #include #include int main(void) { string s = get_string("Input: "); printf("Output:\n"); for (in..
C 언어 | 문자열과 배열 ✔ 학습목표 문자열이 C에서 정의되는 방식과 메모리에 저장되는 방식을 설명할 수 있다. 문자열과 배열 문자열(string) 자료형의 데이터는 사실 문자(char) 자료형 데이터들의 배열이었다. string s = "Hi!"; 와 같이 문자열 s가 정의되어 있다고 생각해보자. s는 문자의 배열이기 때문에 메모리상에 아래처럼 저장되고, 인덱스(예) s[0], s[1] 등)로 각 문자에 접근할 수 있다. 여기서 가장 끝의 '\n'은 문자열의 끝을 나타내는 널 종단문자다. 이는 모든 비트가 0인 1바이트를 의미한다. string names[4]; names[0] = "EMMA"; names[1] = "RODRIGO"; names[2] = "BRIAN"; names[3] = "DAVID"; printf("%s\n..
C 언어 | 배열 ✔ 학습목표 배열을 정의하고 사용하는 방법을 설명할 수 있다. 배열 아래와 같이 세 개의 점수를 저장하고 평균을 출력하는 프로그램을 예로 들어보자. #include #include int main(void) { // Scores int score1 = 72; int score2 = 73; int score3 = 33; // Print average printf("Average: %i\n", (score1 + score2 + score3) / 3); } 만약 점수의 개수가 더 많아진다면 이 프로그램은 많은 부분을 수정해야 한다(변수 선언, 계산식 등). 이 때 활용할 수 있는 것이 배열이다. 배열은 같은 자료형의 데이터를 메모리상에 연이어서 저장하고 이를 하나의 변수로 관리한다. 위 코드에서 배열을 사용하..
C 언어 | 사용자 정의 함수와 중첩 루프 ✔ 학습목표 사용자 정의 함수와 중첩 루프를 작성할 수 있다. 사용자 정의 함수 프로그래밍을 하다 보면 반복적으로 작성해야 하는 코드가 있다. 이런 코드를 여러 번 쓰지 않고 함수 형태로 저장해두면 코드를 간결하고 이해하기 쉽게 만들 수 있다. 이것이 사용자 정의 함수다. "cough"라고 세 번 말하는 프로그램을 작성한다고 생각해보자. #include int main(void) { printf("cough\n"); printf("cough\n"); printf("cough\n"); } 가장 단순한 방법은 printf 함수를 세 번 반복해서 사용하는 것이다. 하지만 이는 말 그대로 동일한 작업의 반복이기 때문에 효율적이지 않다. #include int main(void) { for (int i = 0; ..