https://www.tutorialspoint.com/cprogramming/cprogramming_online_quiz.htm
#include <stdio.h>
main() {
unsigned x = 5, y = &x, *p = y+0;
printf("%u", *p);
}
y -> x의 주소를 가리키는 포인터 변수
*p -> y의 값 + 0 => y의 값 그대로 => x의 값 5
#include <stdio.h>
main() {
int x = 1;
float y = x>>2;
printf("%f", y);
}
x>>2
: x를 2비트 오른쪽 시프트
-> 주의) 그러나 비트 시프트 연산은 정수형에서만 의미가 있다.
1 -> 이진수 00000001
을 오른쪽 2번 시프트 -> 0
=> y에는 0.0
이 저장 -> 부동소수점 형식으로 출력된다.
#include <stdio.h>
main() {
int *p, **q;
printf("%u\n", sizeof(p));
printf("%u\n", sizeof(q));
}
*p
, **q
포인터 변수 p와 이중 포인터 변수 q
-> 어떤 데이터 타입이든 상관없이 모든 종류의 포인터 변수는 같은 크기의 메모리 차지함! 그래서 printf의 2개의 결과값은 같을 것.
%u
-> unsigned integer
, 부호없는 정수 출력하기 위해 사용
#include <stdio.h>
void f() {
static int i =3 ;
printf("%d", i);
if (--i) f();
}
main() {
f();
}
출력 결과)
3 2 1
static
과extern
의 차이점
static
: 한 파일 내에서만 쓰고 싶은 전역 변수 선언extern
: 여러 파일에서 사용하고 싶은 함수, 변수를 선언할 때 사용 -> 기본적으로 변수, 함수는 extern으로 선언된다.#include <stdio.h> //정적 전역 변수: 다른 파일에서 접근할 수 없음 static int globalVar = 100; void func() { //정적 지역 변수: 함수 내에서만 접근 가능, 함수 호출 시 초기화 static int localVar = 0; localVar ++; printf("Local Variable: %d\n", localVar); } int main() { //globalVar는 정적 전역 변수 -> main 파일에서만 접근 간으 printf("Global Variable: %d\n", globalVar); //localVar는 func() 함수 내에서만 사용이 가능함 func(); // Local Variable : 1 func(); // Local Variable : 2 return 0; }
전역변수와 지역변수 차이점
전역변수(global variable)
: 함수 밖에서 선언, 프로그램의 어디서든 접근 가능. 프로그램이 시작될 때 메모리의 데이터 세그먼트에 할당. 프로그램 종료시까지 메모리 유지. 전역 변수는 선언된 파일 내에서 모든 함수에서 접근 가능.extern
키워드를 사용하면 다른 파일에서도 접근 가능. 초기화하지 않으면 0 또는 기본 값으로 초기화됨. 프로그램이 실행되는 동안 메모리에 상주하며 프로그램이 종료시까지 유지됨 .
지역변수(local variable)
: 함수 내부에서 선언. 함수 내에서만 접근 가능. 지역변수는 해당 함수가 호출될 때 스택 메모리(Stack memory)에 할당됨. 함수 실행이 종료되면 메모리 해제됨.
지역변수는 선언된 함수 내에서만 유효함. 함수 외부에서는 접근할 수 없음. 함수가 호출되면 메모리가 할당되고 함수가 종료되면 메모리가 해제
++num
, --num
num++
, num--
#include <stdio.h>
int main() {
int num1 = 2;
int num2 = 2;
int num3;
int num4;
num3 = ++num1;
num4 = --num2;
printf("%d %d \n", num3, num4);
return 0;
}
//결과: 3 1
#include <stdio.h>
int main() {
int num1 = 2;
int num2 = 2;
int num3;
int num4;
num3 = num1++;
num4 = num2--;
printf("%d %d\n", num3, num4);
return 0;
}
// 2 2출력
// num1 값을 num3에 할당한 뒤 num1 값을 1증가 시킴
//num2 값을 num4에 할당한 뒤에 num2의 값을 1감소 시킴
declaration(선언) & definition(정의)
Declaration(선언)
변수나 함수를 소개하고 존재를 알리는 것.
컴파일러에게 변수, 함수의 이름, 타입 및 형식을 알려줌.
실제 메모리를 사용하지는 않는다.
선언만으로는 그 선언이 가리키는 실체에 대해 메모리를 할당하지는 않는다.
예시)int
,char
,void function(int)
등등Definition(정의)
컴파일러에게 실제 변수를 생성하도록 한다.
실제 메모리를 사용한다.
변수나 함수의 실제 구현을 제공하고 메모리 할당
정의는 선언의 확장 -> 선언에 실제 코드 또는 메모리 공간을 할당
변수나 함수를 선언함과 동시에 이에 대한 값까지 부여하는 것
어떤 대상을 선언 없이 정의하는 것은 불가능함!!!!
#include <stdio.h>
int add(int a, int b);
int main() {
int result = add(3,5);
printf("%d", result);
return 0;
}
int add(int a, int b){
return a+b;
}
이렇게 함수를 바로 정의하면
syntax error가 발생하게 된다.
#include <stdio.h>
// int add(int a, int b);
int main() {
int result = add(3,5);
printf("%d", result);
return 0;
}
int add(int a, int b){
return a+b;
}
기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입
struc 구조체이름 {
멤버변수1의 타입 멤버변수1의이름;
멤버변수2의 타입 멤버변수2의이름;
...
}
struct 구조체이름 구조체변수이름;
struct Person { char name[20]; char phoneNum[20]; int age; };
#include <stdio.h>
struct Human {
int age;
int height;
int weight;
};
int main() {
struct Human Man;
Man.age = 20;
Man.height = 190;
Man.weight = 80;
printf("age: %d\n", Man.age);
printf("height: %d\n", Man.height);
printf("weight: %d\n", Man.weight);
return 0;
};
출력 결과)
age: 20
height: 190
weight: 80
typedef
같은 메모리 영역을 여러개의 변수들이 공유하는 기능 - 메모리 절약
모든 멤버 변수가 하나의 메모리 공간을 공유한다.
공용체는 한 번에 하나의 변수만 사용할 수 있다.
union MyUnion {
int intValue;
float floatValue;
char stringValue[20];
};
공용체는 순서가 규칙적이지 않고 미리 알 수 없는 다양한 데이터를 저장하도록 설계됨. 크기가 가장 큰 멤버 변수의 크기로 메모리를 할당 받음. -> 같은 크기로 구성된 배열 요소에 다양한 크기의 데이터를 저장할 수 있음
MyUnion
3개의 멤버 가지는 공용체 -> 각 멤버는 서로 다른 데이터 타입을 가지지만 모두 같은 메모리 공간을 공유
union MyUnion myUnion;
- 공용체 변수 선언
새로운 타입을 선언하면서 동시에 해당 타입이 가질 수 있는 정수형 상숫값도 같이 명시할 수 있는 타입 - 프로그램 가독성도 높아지고, 변수가 지니는 값에 의미도 부여할 수 있게 된다.
enum Weather {
SUNNY = 0,
CLOUD = 10,
RAIN = 20,
SNOW = 30
}
enum Days {
MON, TUE, WED, THU, FRI, SAT, SUN
}
참고)
https://nibble1492.tistory.com/6
https://olivia-blackcherry.tistory.com/457