[Jungle][TIL] 240412 C 언어 개념 정리

somi·2024년 4월 12일
0

[Krafton Jungle]

목록 보기
24/68

C 언어 개념 퀴즈 정리

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


staticextern의 차이점

  • 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;
}

구조체(structure type)

기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입

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 공용체

같은 메모리 영역을 여러개의 변수들이 공유하는 기능 - 메모리 절약
모든 멤버 변수가 하나의 메모리 공간을 공유한다.
공용체는 한 번에 하나의 변수만 사용할 수 있다.

union MyUnion {
	int intValue; 
    float floatValue;
    char stringValue[20];
}; 


공용체는 순서가 규칙적이지 않고 미리 알 수 없는 다양한 데이터를 저장하도록 설계됨. 크기가 가장 큰 멤버 변수의 크기로 메모리를 할당 받음. -> 같은 크기로 구성된 배열 요소에 다양한 크기의 데이터를 저장할 수 있음

MyUnion 3개의 멤버 가지는 공용체 -> 각 멤버는 서로 다른 데이터 타입을 가지지만 모두 같은 메모리 공간을 공유

union MyUnion myUnion; - 공용체 변수 선언


Enumeration 열거형

새로운 타입을 선언하면서 동시에 해당 타입이 가질 수 있는 정수형 상숫값도 같이 명시할 수 있는 타입 - 프로그램 가독성도 높아지고, 변수가 지니는 값에 의미도 부여할 수 있게 된다.

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

https://newcodingman.tistory.com/entry/C%EC%96%B8%EC%96%B4-extern-static-%EB%B3%80%EC%88%98-%EC%B0%A8%EC%9D%B4%EC%A0%90#:~:text=extern%20%EB%B3%80%EC%88%98%EC%99%80%20static%20%EB%B3%80%EC%88%98,%EB%82%B4%EC%97%90%EC%84%9C%EB%A7%8C%20%EC%A0%91%EA%B7%BC%20%EA%B0%80%EB%8A%A5%ED%95%A9%EB%8B%88%EB%8B%A4.

https://unknownpgr.com/posts/c-lang/index.html

https://www.tcpschool.com/c/c_struct_unionEnum

profile
📝 It's been waiting for you

0개의 댓글