Download as pdf or txt
Download as pdf or txt
You are on page 1of 46

C언어

- 정보과학 -
변수

• 변수(variable)
프로그램이 실행되는 동안 필요할 때마다 값을 언제든지 변경할 수 있는 기억 장소(메모리)

• 변수는 기억 장소에 기억된 값과 일대일로 대응되며 변경이 가능한 수이다.


①기억 장소 ②기억 장소에 저장할 값
int a, b, c;
a = 15;
b = 30;
c = a + b;
변수의 특징

• 변수를 사용하기 전에 미리 선언하여야 한다.


예시)
int a;
char s=‘B’;
int c=0;
float b=1.2345;

• 변수를 선언하면 자료의 유형, 메모리 크기가 결정한다.


• 변수에 저장되는 자료는 변수의 자료형과 일치해야 한다.
• 변수에 저장된 값은 언제든지 변경할 수 있다.
변수의 작성 규칙 및 사용 방법

• 작성 규칙(명명 규칙)
• 예약어는 불가(자료형, C문법 관련 명칭)
• 숫자로 시작 불가
• 변수 이름 사이에 공백 포함 불가
• 영어 대문자와 소문자는 엄격하게 구분

• 사용 방법
• 자료형 변수명[, 변수명···]; // 대괄호는 생략 가능
• 변수에 값을 저장하기 위해 대입 연산자(=)를 사용하여 좌변에는 변수 이름을, 우변에는 값을 표현한다.
• 변수명 = 값
예시) num=10; x=2.5; z= x*x+num*3+1; …
변수로 설정할 수 없는 단어 – 예약어

예약어 종류 예약어
자료형 char short int long float double
자료형(부호) signed unsigned
자료형(변수 상태 관련) const static
문법 관련 return
문법 관련(반복문) for while do break continue
문법 관련(조건문) if else switch case default goto
자료구조 관련 sizeof typedef enum union struct
컴파일러 관련 extern auto volatile register
C언어의 자료형

• 자료형(data type): 변수에 저장할 수 있는 데이터의 형식


• C언어의 기본적인 자료형에는 정수형, 실수형, 문자형이 있다.
• 문자형의 char의 경우 아스키 문자의 코드를 정수로 기억한다.
C언어의 기본 자료형
자료형 바이트 수
범위 범위
(정수형) (Byte)
char 1B -128 ~ 127 -27 ~ 27 − 1
short 2B -32768 ~ 32767 -215 ~ 215 − 1
int 4B
-2,147,483,648 ~ 2,147,483,647 -231 ~ 231 − 1
long 4B
-9,223,372,036,854,775,808
long long int
8B ~ -263 ~ 263 − 1
(long long)
9,223,372,036,854,775,807
자료형(실수형) 바이트 수(Byte) 범위
±3.4 ×10^-37
float 4B ~
±3.4 × 10^38
±1.7 ×10^-307
double 8B ~
± 1.7 × 10^307
실수의 표현 방법

• 실수 표현 방식은 대부분 IEEE 754 표준(부동 소수점)을 따른다.


• 부동 소수점 방식은 고정 소수점 방식보다 훨씬 더 많은 범위까지 표현할 수 있지만 항상 오차가 존재한다.

부호1bit 지수부8bit 가수부23bit

0 1 8 9 31

IEEE 32bit 부동 소수점


±(1.가수부)⨯2지수부-127
부호 정수부 소수부

0 1 16 17 31

고정 소수점
출력 – printf(“ 문장 “, 변수);
서식 설명 사용 가능 자료형
%d 부호 있는 10진수 정수(4B)
?에 숫자가 들어가며 숫자의 자릿수 만큼
%0?d
0을 채운 정수를 출력한다. char int short long
?에 숫자가 들어가며 숫자의 자릿수 만큼
%?d
공백을 채운 정수를 출력한다.
%lld 부호 있는 10진수 정수(8B) long long int
%o 부호 없는 8진수 정수 unsigned int, unsigned long …
%x, %X 부호 없는 16진수 정수 unsigned int, unsigned long …
%f, %lf 10진수 방식의 실수(4B, 8B)
마침표 뒤 ?에 숫자가 들어가며 숫자의 크 float double
%.?f
기만큼 소수점 이하 자릿수를 출력한다.
%c 값에 대응하는 단일 문자 char …
%s 문자열 char* char[…]
입력 – scanf(“ 문장 “, &변수);

서식 설명 사용 가능 자료형
%d 부호 있는 10진수 정수(4B)
char int short long
%?d ?에 해당하는 자리수의 정수만 입력 받는다.
%lld 부호 있는 10진수 정수(8B) long long int
%o 부호 없는 8진수 정수 unsigned
%x, %X 부호 없는 16진수 정수 unsigned
%f 10진수 방식의 실수(4B) float
%lf 10진수 방식의 실수(8B) double
%c 값에 대응하는 문자 char …
char* char[…]
%s 문자열
문자열의 경우 변수의 이름 앞에 &를 붙이지 않는다.
추가 – 이스케이프 문자

서식 설명

\n 줄 바꿈(new line)

\t 다음 탭으로 이동(tab 추가)

\b 한 칸 뒤로 이동(backspace)

\\ 역슬래시(\, \)를 그대로 표시

\‘ 작은따옴표를 그대로 표시(single quote)

\“ 큰따옴표를 그대로 표시(double quote)

%% 퍼센트 기호(%)를 그대로 표시


연산자 – 산술, 관계 연산자

산술 연산자 설명 관계 연산자 설명

+ 덧셈 == 값이 서로 같아야 참

- 뺄셈 != 값이 서로 같이 않아야 참

* 곱셈 < 오른쪽 값이 더 커야 참

/ 나눗셈 또는 몫 <= 오른쪽 값이 더 크거나 같아야 참

% 나머지 > 왼쪽 값이 더 커야 참
대입 연산자
= >= 왼쪽 값이 더 크거나 같아야 참
우변의 값을 좌변의 변수에 저장
연산자 – 증감, 복합 대입 연산자
증감 연산자 설명 사용 예 같은 표현

++ 1 증가 a++, ++a a=a+1

-- 1 감소 a--, --a a=a-1

복합 대입 연산자 설명 사용 예 같은 표현

+= 값을 더하여 대입 a += 3 a = a + 3

-= 값을 빼서 대입 a -= 3 a = a – 3

*= 값을 곱하여 대입 a *= 3 a = a * 3

/= 값으로 나누어 대입 a /= 3 a = a / 3

%= 값으로 나눈 나머지를 대입 a %= 3 a = a % 3
연산자 – 논리 연산자

C언어에서는 논리 연산 결과를 숫자 값으로 결과를 반환한다.

논리 연산자 설명 사용 예 결과(논리값) 결과(숫자값)

&& AND, 양쪽 모두 참이여야 참 3 == 3 && 2 < 3 True 1

|| OR, 둘 중 하나만 참이어도 참 3 > 3 || 3 < 3 False 0

! NOT, 참이면 거짓, 거짓이면 참 !(3 >= 0) False 0


연산자 – 비트 연산자

구분 비트 연산자 설명 사용 예 결과

& 두 비트가 모두 1일 때 1 12 & 5 4

| 두 비트 중 하나라도 1이면 1 12 | 5 13
비트 논리 연산자
^ 두 비트 중 하나만 1일 때 1 12 ^ 5 9

~ 비트가 1이면 0, 0이면 1 ~12 -13

왼쪽 값의 전체 비트를 오른쪽 값의
<< 1 << 5 32
수 만큼 왼쪽으로 이동
비트 이동 연산자
왼쪽 값의 전체 비트를 오른쪽 값의
>> 128 >> 4 8
수 만큼 오른쪽으로 이동
연산자 – 비트 연산자(예시)
10 & 7

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0

& 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

결과값: 2

10 | 7

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0

| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1

결과값: 15
연산자 – 비트 연산자(예시)
10 ^ 7

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0

^ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1

결과값: 13

~10

~ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1

맨 왼쪽 비트가 1이면 음수이다. 결과값: -11


연산자 – 비트 연산자(예시)
~10

~ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1

맨 왼쪽 비트가 1이면 음수이다. 결과값: -11


결과가 음수이므로 2의 보수로 1의 보수로 변환

재변환하여 값을 유추한다.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0

+ 1

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1

맨 왼쪽 비트가 1이면 음수이다. 절대값: 11

2의 보수란? 1의 보수 + 1
기호 상수와 상수화 변수

• 기호 상수(symbolic constant)는 값에 이름을 붙인 것


• 사용 방법: #define 이름 상수값
• 예시)
• #define PI 3.141592653589

• 상수화 변수(const 변수)


• const int a = 7;

• 기호 상수 및 상수화 변수 등을 사용하면 코드의 가독성이 높아진다.


자료의 형변환
• 변수의 자료형을 다른 자료형으로 변환할 수 있다.
• 자료형의 자료형태 변환이라고도 한다.

• 형변환은 명시적 형변환과 암묵적(묵시적) 형변환이 있다.


자료의 형변환 – 암묵적(묵시적) 형변환

#include <stdio.h>

int main(void) {
int a = 0; 실수 값을 정수에 저장

float b = 2.3;
printf(“%f, %d”, b, a);
a = b / 2; 정수를 실수로 변환 후 출력
printf(“%f”, (float)a);
return 0; • If a conversion specification is invalid, the behavior is undefined. If any argument is not the
correct type for the corresponding conversion specification, the behavior is undefined.
정수를 실수로 출력함
} • 변환 사양이 유효하지 않은 경우 동작이 정의되지 않습니다. 인수가 응답하는 변환 사양에 대해
올바른 유형이 아닌 경우 동작이 정의되지 않습니다.

• 해당 동작은 컴파일러 설계자에게 아무것도 지시하지 않습니다. 따라서 해당 동작 결과는 컴파일


러 설계자의 의도대로 작동합니다.
자료의 형변환 – 명시적 형변환

#include <stdio.h>
정수/정수로 정수 값 출력
int main(void) {
int a = 10, b = 3;
printf(“%d / %d = %d\n”, a, b, a / b);
printf(“%d / %d = %f\n”, a, b, (float)a / b);
return 0;
정수를 실수로 변환함
}
주석 처리
• C언어에서 주석으로 처리하는 방법은 총 2가지를 제시한다.

• 단일 행 주석( // 내용 )

• 범위 주석(/* 내용 */)
주석 처리

#include <stdio.h>
// 주석에 대한 설명
int main(void) {
int a = 10, b = 3; // 여기는 주석 처리
printf(“어떻게 하는지 모르겠다”);
/* printf(“%d / %d = %f\n”, a, b, (float)a / b);
여기도 주석이라 실행 안됨 */
return 0;
}
삼항연산자

#include <stdio.h> • 삼항연산자(조건문이 아닌 연산자 취급)


• 사용법(소괄호는 생략 가능)
(조건) ? (참 값) : (거짓 값)
int main() {
int a, b;
scanf(“%d %d”, &a, &b);
int max = (a > b) ? a : b;
int min = (a < b) ? a : b;
printf(“max: %03d, min: %03d\n”, max, min);
return 0;
}
선택 실행 구조(조건문)
• 선택 실행 구조는 조건식의 계산 결과나 값에 따라 프로그램의 흐름을 변화시킬 수 있는 구조
• 단순 선택, 중첩 선택, 다중 선택의 형태가 있다.
• C언어에서 선택 실행 구조를 조건문이라고도 부르며 문법으로는 2가지 종류가 있다
• if, switch
• if, if~else
• switch ~ case

단순 선택 단순 선택 중첩 선택 다중 선택

거짓 거짓
조건식 조건식 조건식1

거짓
참 참 참 조건식2

거짓 참
실행 1 실행 1 실행 1 실행 1
실행 1 실행 2 실행 3
실행 2-1 실행 2-2
선택 실행 구조(조건문)
단순 선택 … • 조건식의 계산(판단) 결과가 참인 경우에 ‘실행 1’ 부분을 실행하고

if(조건식) • 거짓인 경우에는 ‘실행 1’ 부분을 실행하지 않고 지나간다.

조건식 {

실행 1;
거짓
실행 1 }


단순 선택 • 조건식의 계산(판단) 결과가 참인 경우에 ‘실행 1’ 부분을 실행하고
if(조건식)
{ • 거짓인 경우에는 ‘실행 2’ 부분을 실행한다.
거짓 실행 1;
조건식 }
else

{

실행 1 실행 1 실행2;
}

선택 실행 구조(조건문)
중첩 선택


if(조건식) • 조건 선택 구조 안에 다른 조건 선택 구조를 중첩해 넣으면 여러가
조건식1
거짓 {
실행 1;
지 상황에 따라 다르게 실행할 수 있는 복잡한 선택 구조를 만들어
} 낼 수 있다.
거짓
참 조건식2 else
{
if(조건식2)

실행 1 {
실행2-1;
실행 2-1 실행 2-2
}
else
{
실행2-2;
}


다중 선택 switch(정수값으로 평가되는 변수나 수식, 문자) • 값에 따라 분기하는 다중 선택 구조를 사용할 수 있다.
{
case 값1:
실행1;


break;
• 입력된 값이 ‘값1’인 경우 ‘실행1’을 수행하고 ‘값2’인 경우 ‘실행2’를
수행한다.
case 값2:
실행2;
break;
case 값3: • 입력된 값이 ‘값1’, ‘값2’, ‘값3’ 모두 아닐 경우 default의 ‘실행‘ 을 수행
실행3; 한다.
실행 1 실행 2 실행 3 break;
default: 실행;
}

선택 실행 구조(조건문(if, if~else)) – 예시
#include <stdio.h>

int main() {
int age, s, h, w;
if (s == 0) {
printf(“나이, 성별, 키, 몸무게를 입력하세요.\n”);
printf(“남성\n”);
scanf(“%d %d %d %d”, &age, &s, &h, &w);
} else {
printf(“여성\n”);
if (age < 19) {
}
printf(“미성년자입니다.\n”);
}
printf(“키는 %3dcm이며 몸무게는 %2dkg입니다.”,
h, w);

return 0;
}
선택 실행 구조(조건문(switch~case)) – 예시
#include <stdio.h>

int main() {
char c;
scanf(“%c”, &c);
switch( c ) {
case ‘W’:
printf(“앞으로!”);
break;
case ‘S’:
printf(“뒤로!”);
break;
case ‘Q’:
printf(“궁극기 사용!”);
break;
case ‘1’:
case ‘2’:
printf(“무기를 꺼냈습니다.”);
break;
default:
printf(“알 수 없는 키 입니다.”);
break;
}
return 0;
}
반복 실행 구조(반복문)
• 반복 실행 구조는 조건식의 계산 결과나 값에 따라 원하는 명령들을 반복적으로 실행하는 구조
• 단순 반복, 중첩 반복의 형태로 선택 실행 구조(조건문)와 함께 사용 가능
• C언어에서 중첩 실행 구조를 반복문이라고도 부르며 문법으로는 3가지 종류가 있다
• for, while, do~while

단순 반복1 단순 반복2
for 반복 중첩 반복
while() do~while()

거짓
조건식 실행 1 실행 1 조건식1

거짓 참

조건식
실행 1 조건식2
실행 1 조건식 참

실행 2
참 거짓 거짓 실행 2

실행 3 거짓
반복 실행 구조(반복문)
단순 반복1 …
while() while(조건식) • 조건식의 계산 결과가 참인 동안 ‘실행1’ 부분을 반복적으로 실행
{
• 조건식의 계산(평가) 결과가 거짓이 되는 경우에는 ‘실행1’ 부분의
실행1;
}
반복 실행을 중단
조건식 … • 반복 중단 후 다음 명령 부분으로 진행
거짓

실행 1


단순 반복2 do • 반복을 위한 조건 검사를 나중에 수행하는 형태
do~while()
{
실행1; • ‘실행1’은 적어도 한번은 실행된다.
} while(조건식)

실행 1

조건식

참 거짓
for 반복

반복 실행 구조(반복문)
실행 1


조건식 for(실행1; 조건식; 실행3) • 실행1: 처음에 1회만 실행
{
참 • 조건식: 반복 조건 검사
실행2;
실행 2
거짓
} • 실행2: 반복 실행 내용

실행 3 • 실행3: 반복 실행 후 처리
• 이후 ‘조건식 검사 → 실행2 → 실행3’을 반복적으로 실행

일부 반복
반복 중단

반복 블록 • continue가 실행되면 이후 실행을 중단
실행 1 {
실행1; • 실행 중단 후 반복 블록의 처음으로 이동
continue;
조건식 실행2;


break; • Break가 실행되면 반복을 중단
실행3
continue; } • 반복 중단 이후 ‘실행4’를 수행
거짓 실행4

break;
반복 실행 구조(반복문 – for) – 예시

#include <stdio.h>

int main() {
int a=2;
for(int i = 0; i<=9; i+=1) {
printf(“%dx%d=%d”, a, i, a*i);
}
return 0;
}
반복 실행 구조(반복문 – while) – 예시

#include <stdio.h>

int main() {
int a=1;
while (a < 5) {
printf(“%d\n”, a);
a += 1;
}
return 0;
}
반복 실행 구조(반복문 – do~while) – 예시

#include <stdio.h> • while 조건식을 만족하지 않더라도 출력됨

int main() {
int a=5;
do {
printf(“%d\n”, a);
a += 1;
} while (a < 5);
return 0;
}
배열(array)
• 같은 이름으로 참조 번호만 다르게 하여 데이터를 저장하고 관리하는 변수
• 사용 예시
자료형 이름[개수];
• 예시
int a[10]; // 정수값을 10개 저장하는 a라는 이름의 배열 선언
배열 개수 10

int a[10] =
배열(array)
int a[10]; // 정수값을 10개 저장하는 a라는 이름의 배열 선언
a[0] = 1;
a[1] = 2;
a[3] = ‘A’; // 문자 A는 정수로 저장됨.
a[5] = 1.234; // 배열 a의 자료형은 int(정수)여서 소수점 이하 자리는 제거됨.
배열 개수 10

int a[10] = 1 2 0 65 0 1 0 0 0 0

a[0] a[9]
배열(array)과 리스트 차이점
• C언어 배열과 파이썬 리스트(List)는 많은 구조적 차이점이 존재한다. 이에 따라 파이썬의 리스트에
서 작동하는 append, pop, insert등 함수를 사용할 수 없다.

#include <stdio.h>
• C언어의 배열은
• 요소 삭제 불가
• 요소 삽입 불가 int main() {
• 슬라이스( [ : ] ) 불가
int a[10];
a.append(); // 컴파일 에러!
a.insert(); // 컴파일 에러!
a = a[1:2]; // 컴파일 에러!

return 0;
}
배열 – 예시
#include <stdio.h>

int main() {
int a[10];
for(int i = 0; i < 10; i+=1) {
scanf(“%d”, &a[i]);
}
for(int i = 0; i < 10; i+=1) {
printf(“%d_”, a[i]);
}
return 0;
}
2차원 배열 – 예시
#include <stdio.h>

int main() {
int a[4][4] = {}, as[4][4]; = {};
for(int i = 1; i < 4; i+=1) {
for(int j = 1; j < 4; j+=1) {
scanf(“%d”, &a[i][j]);
}
}
for(int i = 1; i < 4; i+=1) {
for(int j = 1; j < 4; j+=1) {
as[i][j] = a[i][j] + as[i-1][j] + as[i][j-1] + as[i-1][j-1];
}
}
for(int i = 1; i < 4; i+=1) {
for(int j = 1; j < 4; j+=1) {
printf(“%d”, as[i][j]);
}
}
return 0;
}
함수(function)
• 어떤 상황에 필요한 작업들을 하나로 묶어 정의하고 이를 편리하게 불러 사용할 수 있는 작업 단위
• 모듈화 구조라고 볼 수 있음


자료형 함수이름(매개변수1, ...) • 함수: 여러 가지 필요한 작업들을 묶어 원하는 형태로 이름을 붙여 정의
{
작업1;
작업2;
작업3;
... • 함수의 실행 결과를 반환한다.
return (반환값);
} • 함수의 ‘반환 값’에 따라 ‘자료형’을 정한다.

… …
int f(int a) • 한 개의 정수 값을 받아 0 void f(int a) • 반환하는 값이 없을 경우
{ 보다 큰지 확인하고 0보다 {
작을 경우 –를 붙여(절대값) • 반환값의 자료형을 void로
if (a > 0) { printf(“%d이(가) 좋아요!”, a);
return a; 함수를 호출한 곳에 반환 return; // 생략 가능
설정하면 된다.
} else { 한다. }
return -a; …
}
}

함수(function)
• 어떤 상황에 필요한 작업들을 하나로 묶어 정의하고 이를 편리하게 불러 사용할 수 있는 작업 단위
• 모듈화 구조라고 볼 수 있음

… • 함수: 여러 가지 필요한 작업들을 묶어 원하는 형태로 이름을 붙여 정의

반환자료형 함수이름(매개변수1, ...) • 함수의 실행 결과를 반환한다.


• 함수의 ‘반환 값’에 따라 ‘반환 자료형’을 정한다.
{
• 함수의 ‘반환 값’이 없는 경우 ‘자료형’은 void로 설정 할 수 있다.(return 생략 가능)
작업1;
• 함수의 ‘반환 값’이 정수라면 char, short, int, long, long long int로
작업2;
• 함수의 ‘반환 값’이 실수라면 float, double로 작성할 수 있다.
작업3;
• 함수 이름은 변수의 작성 규칙(명명 규칙)과 동일하게 작성한다.
... • 함수의 매개변수는 변수의 선언 방법과 동일하다.
return (반환 값);
}

함수 – 선언 및 정의
#include <stdio.h> #include <stdio.h>
// 함수의 선언과 정의를 동시에 // 함수 선언 먼저
void swap(int a, int b) { void swap(int, int);

printf("this is fake swap.\n");


int main() {
int temp = a;
int a=3, b=4;
a = b;
swap(a, b); // 함수 호출
b = temp;
printf("main: %d %d\n", a, b);
printf("swap: %d %d\n", a, b);
return 0;
} }
// 함수의 정의는 호출하고 난 후 정의해도 OK
int main() { void swap(int a, int b) {
int a=3, b=4; printf("this is fake swap.\n");
swap(a, b); // 함수 호출 int temp = a;
printf("main: %d %d\n", a, b); a = b;
return 0; b = temp;

} printf("swap: %d %d\n", a, b);


}
함수 – 매개변수의 포인터 사용
#include <stdio.h> • 포인터 연산자 * 를 사용하면 포인터 변수 a에 저장된 메모리
// 함수의 선언과 정의를 동시에 주소 값의 기억 공간에 저장된 값에 접근할 수 있다.
void swap(int *a, int *b) {
printf("this is real swap.\n"); • 포인터 연산자 & 를 사용하면 변수의 기억 공간의 메모리 주소
int temp = *a; 값에 접근할 수 있다.
*a = *b;
*b = temp;
printf("swap: %d %d\n", a, b);
}

int main() {
int a=3, b=4;
swap(&a, &b); // 함수 호출
printf("main: %d %d\n", *a, *b);
return 0;
}
지역변수, 전역변수
#include <stdio.h>
int a; // 전역 변수로 자동으로 0으로 초기화 된다.
void globalTest() {
a += 10; // 전역 변수를 활용
• 지역 변수: 중괄호 내부에 선언된 변수 printf(“global 테스트: %d\n”, a);
}
• 전역 변수: 파일 내부, 함수 외부에 선언된 변수
int main() {
int b = 3; // 지역 변수
printf("지역변수 테스트: %d\n", b);
globalTest();

{
int c = 7; // 지역 변수
printf("지역변수 테스트: %d\n", c);
}

// 컴파일 에러! 지역 변수 c의 범위를 벗어남.


printf("지역변수 테스트: %d %d\n", b, c);
return 0;
}

You might also like