C 6

C / 포인터와 함수

C에서는 헤더 파일에 존재하는 함수 말고도 사용자가 직접 함수를 만들어 사용할 수 있다. 아래 방법을 따르면 당신도 함수를 만들 수 있다.#include int add(int a, int b) { printf("add함수 실행\n"); return a + b;}int main() { int x = 3, y = 4; printf("%d + %d = %d", x, y, add(x, y)); return 0;}함수명 함수를 정의할 때 함수명을 정해주어야 한다. 이후 함수를 호출하고 싶을 때 함수명을 통해 호출하면 된다. 매개변수 함수 안에서 값이 바뀔 매개변수이다. 매개변수의 개수도 사용자가 지정할 수 있고, 매개변수의 변수타입 또한 지정 가능하다. 심지어 포인터 변수도 가능하다. 이때 매개변수 선언된 변수..

C 2025.04.20

C / 배열과 포인터

- 배열이란?코드를 작성하며 배열을 아주 많이 사용하곤 한다. 하지만 배열이란 정확히 무슨 뜻일까? 배열이란, 연속된 메모리에 동일한 변수 타입을 가진 원소들의 모음을 말한다. 이때 배열의 원소는 배열의 식별자와 인덱스를 통해 접근 가능하다. 배열의 선언 시 원소의 변수타입, 식별자, 원소의 개수가 포함되어야 한다.#include int main() { int num[3] = { 1, 2, 3 }; return 0;}원소의 변수 타입 설정(int)배열의 식별자 설정(num)원소의 개수 설정(3개) - [ ] 연산자배열의 인덱스를 넣어, 배열의 n 번째 원소에 접근할 때 쓰이는 연산자이다. 하지만 배열을 선언할 때를 제외한 모든 경우에서 [ ] 연산자는 특별한 기능을 갖고 있다. a[n] == *(a +..

C 2025.04.16

C / 함수의 인자 평가 순서

- 함수의 인자 평가는 순서가 없다.어떤 함수의 인자가 연속적으로 나열되었을 땐, 컴파일러가 값을 처리하는 순서가 존재하지 않는다.#include int main() { int a[3] = { 1, 2, 3 }; int* ptr = a; printf("%d, %d, %d\n", *ptr++, *ptr++, *ptr++); return 0;} 위 코드는 printf에서 *ptr++을 사용하여 a배열의 원소를 순차적으로 나열하는 로직을 지녔다. 언뜻 보기에는 정상적으로 1, 2, 3이 출력될 것으로 보이지만... 결과는 아래와 같다.  이유는, C 언어에서 함수 인자의 평가 순서는 정해져 있지 않기 때문이다. printf에서 한 줄로 나열된 3개의 *ptr++ 중 어느 것부터 실행하여 값을 반환할 지 정해..

C 2025.04.09

C / 포인터를 향하여 - 프로그램 메모리 구조 - Ch.3

-  프로그램 메모리 구조 사용자가 C언어를 컴파일한다고 했을 때 지역변수가 저장될 것이고, 함수가 실행될 것이다. 하지만 이런 정보들은 어디에 저장하고, 어떻게 컴파일러는 많은 변수들과 명령어들을 효율적으로 관리하여 프로그램을 실행할까? 아래 그림은 프로그램 메모리 구조의 일부를 도식화한 것이다. 더 많은 영역이 있지만 프로그램을 컴파일할 때 쓰이는 구역들만 살펴보도록 하자. - Text Area 여기에는 프로그램의 코드가 저장된다. 이 때 사용자 친화적인 C코드로 저장되는 것이 아닌, 컴파일러에 의해 어셈블리어로 변환되어 저장된다.  Read-Only 영역이다. 프로그램이 실행되는 동안에는 수정, 삭제가 불가능하다. - Initialized Data 선언과 동시에 초기화된 전역변수, static 변수..

C 2025.04.07

C / 포인터를 향하여 - 포인터 값 초기화 및 값 수정 - Ch.2

- 포인터 초기화 시 주의할 점 포인터를 초기화할 때는 여러 가지 방법이 존재한다. 포인터의 type마다, 또 선언과 동시에 초기화하냐에 따라서 코드의 라인 수가 달라질 수 있다. 따라서 여러 가지 경우의 수를 들어 주의할 점을 전하고자 한다.#include int main(){ int x = 3; int* intPtr1 = &x; int* intPtr2; intPtr2 = &x; int* intPtr3 = x; int* intPtr4; intPtr4 = x;//------------------------------// char str[] = "KATE"; char* strPtr1 = str; char* strPtr2; strPtr2 = str; char* strPtr3 = &str; char* st..

C 2025.04.04

C / 포인터를 향하여 - Ch.1

C++을 중점적으로 다루고 싶지만, C++은 C언어 기반, 객체지향 프로그래밍 언어로서 만들어졌기 때문에 C에서의 개념이 다수 사용된다. 그 중 포인터의 개념은 정말 중요해서 이 부분을 소홀히 하면 C++에서도 흠이 생길 수 밖에 없다. 따라서 C언어 중 포인터의 개념과 심화과정에 대해 다뤄 보려 한다. - 포인터 변수를 어떻게 바라보아야 할까? 포인터 변수를 바라볼 때는 2가지만 기억하면 편하다. 그 변수가 담고 있는 정보의 주소, 정보의 type이다.1. 포인터 변수는 초기화된 정보의 주소를 기억하고 있다.2. 포인터 변수는 초기화된 정보의 type를 기억하고 있다. 아래 코드를 살펴보며 자세히 분석해보자.#include int main(){ int a[]={10, 11, 12}; int *p; ..

C 2025.04.02