본문 바로가기
Programming Language/C++

[C++] C언어 살펴보기

by spareone 2025. 4. 30.

이 글은 C++ 프로그램을 작성할 때 반드시 알아야 할 C언어 특징을 정리한 글입니다.

1. 표준 입출력

C언어에서의 입출력 함수는 다음과 같습니다.

출력 : printf(), 입력 : scanf()

#include <stdio.h>
 
int main() {
int n1, n2;
 
print("두 수 입력 : ");
scanf("%d %d" , &n1, &n2);
 
print("두 수의 합 : %d\n", n1 + n2);
 
return 0;
}

2. 배열

C언어에서 배열을 선언하는 방법입니다.

#include <stdio.h>
 
int main() {
int arr[5];
int arr[5] = {1, 2, 3, 4, 5};
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
int arr[1][1] = 1; // 1행 1열 값 변경
}

3. 포인터

C언어의 특징 중 하나인 포인터입니다. 주소값을 저장하기 위해 사용되는 변수이며, 해당 주소는 특정 메모리 영역을 가리키게 됩니다.

#include <stdio.h>
 
int main() {
int n = 1;
int *pNum = &n; // n을 가리키는 포인터 (n의 주소를 저장하는 포인터)
 
print("n 주소 : %d", &n);
print("n 값 : %d", n);
print("pNum 주소 : %d", &p); // 포인터 변수 pNum을 가리키는 주소
print("pNum 값 : %d", p); // 변수 n을 가리키는 주소
print("pNum이 가리키는 n의 값 : ", *p);
}
[그림 1] 위 코드의 메모리 구조

[그림 1]에서의 포인터 크기는 4바이트로 표현했지만, 실제로는 OS별로 다를 수 있습니다.

4. 배열과 포인터

배열과 포인터는 깊게 연관되어 있습니다.

배열은 같은 자료형의 값을 연속적으로 메모리에 저장하는 자료구조이며, 배열의 주소값은 첫 번째 원소를 기준으로 합니다.

따라서, 포인터가 배열을 가리킬 때 이 둘은 동등하게 처리될 수 있습니다.

#include <stdio.h>
 
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *pNum = arr;
 
printf("%d\n", *pNum); // arr[0] 출력
printf("%d\n", *pNum + 1); // arr[1] 출력
printf("%d\n", pNum[1]); // arr[1] 출력
}

5. 함수

함수는 특정 기능을 정의하고 사용할 수 있도록 하는 역할을 합니다.

#include <stdio.h>
 
// n의 m제곱을 계산하는 함수
int power(int n, int m) {
int res = 1;
for(int i = 0; i < m; i++)
res *= n;
return res;
}
 
int main() {
int a = 4, b = 3
int res = power(a, b); // 4의 3제곱을 계산하는 함수 호출
print("%d\n", a);
}

이 때 매개변수는 Call by Value에 의해 값을 복사해서 매개변수로 전달하게 됩니다.
함수 안에서 매개변수 값(m, n)이 변경된다고 해도 밖에서는(a, b) 영향이 없습니다.

만약 매개변수 값(m, n)이 변경될 때 밖에서의 값(a, b)이 변경되기를 원한다면,
주소값을 직접 전달하는 Call by Address 방식을 사용해야 합니다.

6. 상수

상수는, 변수와 다르게 값이 고정되어 있습니다. 즉, 변수처럼 값 수정이 불가능하며 변경되지 말아야 할 값을 상수로 정의합니다. (3.14 등)
억지로 값을 변경하려고 시도하면 에러가 발생합니다.

#include <stdio.h>
 
int main() {
const double PI = 3.14 // 원주율 상수 정의
print("%d", 3 * 3 * PI);
}

만약 상수와 포인터를 결합한다면, 두 가지의 경우로 이용될 수 있습니다.
포인터 변수 pNum이 변수 n을 가리킨다고 가정합니다.

  1. pNum을 통해 n 값 변경 불가
  2. pNum이 가리키는 변수 변경 불가
#include <stdio.h>
 
int main() {
int n1 = 1, n2 = 2;
 
const int *p1; // 1의 경우
int * const p2 = &n2; // 2의 경우
 
*p1 = 4; // 에러 발생
p2 = &n1; // 에러 발생
}

7. 구조체

구조체를 이용해 사용자가 원하는 자료형을 정의할 수 있습니다.

다음 코드는 구조체를 이용하여 2차원 좌표를 저장하는 구조체의 예시입니다.

#include <stdio.h>
 
struct Point{
int x;
int y;
};
 
int main() {
struct Point A = {1, 2}; // (1, 2)인 구조체 생성
printf("(%d, %d), A.x, B.x) // 포인터의 경우 . 대신 -> 이용
}

'Programming Language > C++' 카테고리의 다른 글

[C++] 클래스와 객체  (0) 2025.04.30
[C++] C++의 기본 (2)  (0) 2025.04.30
[C++] C++의 기본 (1)  (0) 2025.04.30

댓글