C언어 정리 - ccyomni/ex250310_second GitHub Wiki

#include <stdio.h>

int main()
{
	printf("Hello \n"); // \n은 줄 바꿈을 의미
	return 0; // 프로그램이 정상적으로 종료되었음을 알려줌, 0은 에러 없이 잘 끝났다는 뜻
}
#include <stdio.h>

int main()
{
	printf("정수 입력: "); //사용자에게 값을 입력하라는 안내 메시지
	int n; //입력받은 값을 저장할 메모리 공간을 만들어줌
	scanf_s("%d", &n); //사용자로부터 정수 값을 입력받아 n에 저장
	//&n은 변수 n의 주소를 의미
	//입력받은 값을 해당 메모리에 저장하기 위해 필요
	printf("정수 : %d\n", n); //입력된 정수n을 출력
}
#include <stdio.h>

int main()
{
	printf("ABC 100\n");
	printf("ABC %d\n", 100); //%d는 정수 출력
	printf("ABC %d %d\n", 100, 200);
	printf("ABC %d %g\n", 100, 200.12); //%g는 실수 출력
}
#include <stdio.h>

int main()
{
	printf("ABC %d %d\n", 100, 200);

	int a = 100;
	int b = 200; //변수 a와 b를 선언하고 각각 정수 값을 넣음
	printf("ABC %d %d\n", a, b);

	a = 1500; //변수 a의 값을 100에서 1500으로 변경
	printf("ABC %d %d\n", a, b);
}
#include <stdio.h>

int main()
{
	int n = 10;
	int a = 1 + 2;
	int b = 10 / 3; //3.333..이지만 정수형이라서 3만 저장

	printf("%d\n", n); //n의 값을 출력:10
	printf("%d\n", a); //a의 값을 출력:3
	printf("%d\n", b); //b의 값을 출력:3
}
#include <stdio.h>

int main()
{
	int n = 10;

	printf("%d %d\n", n, sizeof(n)); //sizeof(n)은 n의 자료형 크기
	printf("%p %d\n", &n, sizeof(&n)); //%p는 포인터(주소) 출력 포맷
	//&n은 변수 n의 메모리 주소
}
#include <stdio.h>

int main()
{
	int a = 10; //정수형 변수 a에 10을 저장
	int b = 3; //정수형 변수 b에 3을 저장

	printf("%d\n", a + b);
	printf("%d\n", a - b);
	printf("%d\n", a * b);
	printf("%d\n", a / b);
	printf("%d\n", a % b);
}
#include <stdio.h>

int main()
{
	int a = 10;
	int b = 3;

	printf("%d\n", a + b);
	int result = a + b;
	printf("%d\n", result);
}
#include <stdio.h>

int main()
{
	int a = 10;
	int b = 3;

	printf("%d\n", a == b);
	printf("%d\n", a != b);
	printf("%d\n", a <= b);
	printf("%d\n", a >= b);
	printf("%d\n", a < b);
	printf("%d\n", a > b);
	//참이면 1, 거짓이면 0 출력
}
#include <stdio.h>

int main()
{
	int a = 10;
	int b = 3;

	printf("%d\n", a);
	printf("%d\n", +a); //양수 표시, 변화 없음
	printf("%d\n", -a); //-10으로 바꿈
}
#include <stdio.h>

int main()
{
	int a = 10;

	++a; //a의 값을 1 증가시킴, a=11
	printf("%d\n", a);
	a = a + 1; //a=12
	printf("%d\n", a);
}
#include <stdio.h>
int main()
{
  int a = 10;
  int b = 0;

  // b = ++a;  // 전위 증가 (a가 먼저 증가하고, 그 결과를 b에 대입)
  b = a++;    // 후위 증가 (a를 먼저 b에 대입하고, 그 후에 a를 증가시킴)
  printf(" %d %d\n ", a, b);  // 출력 결과 예상
}
#include <stdio.h>
int main()
{
  int a = 10;
  int b = 0;

  b = --a;          // 전위 감소: a를 먼저 1 줄이고, 그 값을 b에 대입
  // b = a--;       // 후위 감소: b에 먼저 a값을 대입한 뒤, a를 1 줄임
  printf(" %d %d\n ", a, b);
}
  • 논리 연산자
#include <stdio.h>
int main()
{
	int a = 1; //a는 참
	int b = 0; //b는 거짓

	printf("%d\n", a && b); // AND(그리고): 둘 다 참이어야 참
	printf("%d\n", a || b); // OR(또는): 둘 중 하나라도 참이면 참
	printf("%d\n", !a);     // NOT(부정): a가 참이면 거짓으로
	printf("%d\n", !b);     // NOT(부정): b가 거짓이면 참으로
}
  • int n1
#include <stdio.h>

int main()
{
	int n1 = 1;
	int n2 = 2;

	printf("%d + %d = %d\n", 1, 2, 3);
	printf("%d + %d = %d\n", 1, 2, 1 + 2);
	printf("%d + %d = %d\n", n1, n2, n1 + n2);

	int result = n1 + n2;
	printf("%d + %d = %d\n", n1, n2, result);
}
  • sizeof
#include <stdio.h>

int main()
{
	int n = 10;

	printf("%d , %d\n", sizeof(int), sizeof(n));
}
  • c언어에서 다양한 자료형의 크기(바이트 단위)
#include <stdio.h>

int main()
{
	char c = 10;
	short s = 10;
	int n = 10;
	long l = 10;
	float f = 10;
	double d = 10;
	//sizeof(char) : char 타입의 크기
	//sizeof(c) : 변수 c의 크기

	printf("%d , %d\n", sizeof(char), sizeof(c)); //1
	printf("%d , %d\n", sizeof(short), sizeof(s)); //2
	printf("%d , %d\n", sizeof(int), sizeof(n)); //4
	printf("%d , %d\n", sizeof(long), sizeof(l)); //4(또는 8)
	printf("%d , %d\n", sizeof(float), sizeof(f)); //4
	printf("%d , %d\n", sizeof(double), sizeof(d)); //8
}
  • 포인터와 변수의 주소
#include <stdio.h>

int main()
{
	int n = 10;

	printf("%p , %d\n", &n, n);
	//&n은 변수 n이 저장된 메모리 주소를 알려줌, %p 사용
	//메모리 주소와 값은 다름, %d 사용
}
  • 조건문
#include <stdio.h>

int main()
{
    if (1)  // 조건문 시작, 1은 참을 의미
    {
        printf("Hello True\n");  // 조건이 참일 경우 실행
    }
}
#include <stdio.h>

int main()
{
    if (1)  // 첫 번째 조건문
    {
        printf("Hello True\n");  // 조건이 참일 경우 실행
    }

    if (0)  // 두 번째 조건문
    {
        printf("Hello False\n");  // 조건이 거짓일 경우 실행되지 않음
    }
}
  • else
#include <stdio.h>

int main()
{
    if (1)  // 첫 번째 조건문
    {
        printf("Hello True\n");  // 조건이 참일 경우 실행
    }
    else  // 조건이 거짓일 경우 실행
    {
        printf("Hello False\n");  // 조건이 거짓일 경우 실행되지 않음
    }
}
#include <stdio.h>

int main()
{
    int a = 10;
    int b = 5;

    if (a < b)  // 첫 번째 조건문
    {
        printf("Hello True\n");  // a가 b보다 작은 경우 실행
    }

    if (a >= b)  // 두 번째 조건문
    {
        printf("Hello False\n");  // a가 b보다 크거나 같은 경우 실행
    }
}
#include <stdio.h>

int main()
{
  int a = 10;
  int b = 20;

  if (a < b)  // 조건이 a < b일 때
  {
    printf("Hello True\n");  // a가 b보다 작은 경우 실행
  }
  else  // 조건이 거짓일 때
  {
    printf("Hello False\n");  // a가 b보다 크거나 같은 경우 실행
  }
}
  • switch문
#include <stdio.h>

int main()
{
    switch (1)  // switch문 시작, 값이 1로 설정됨
    {
    case 1:  // case 1에 해당하는 경우
        printf("Hello : %d\n", 1);  // 1이 맞으면 실행
        break;  // switch문을 종료
    }
}
#include <stdio.h>

int main()
{
  switch (2)  // switch 문에 주어진 값은 2
  {
  case 1:
    printf("Hello : %d\n", 1);
    break;
  case 2:
    printf("Hello : %d\n", 2);
    break;
  case 3:
    printf("Hello : %d\n", 3);
    break;
  }
}

switch문에서 어떤 case에도 해당하지 않을 때 default 실행

#include <stdio.h>

int main()
{
  switch (5)  // switch에 주어진 값은 5
  {
  case 1:
    printf("Hello : %d\n", 1);
    break;
  case 2:
    printf("Hello : %d\n", 2);
    break;
  case 3:
    printf("Hello : %d\n", 3);
    break;
  default:
    printf("default\n");
    break;
  }
}

switch문에서 문자 연산이 어떻게 숫자로 바뀌는지 확인

#include <stdio.h>
#include <conio.h>

int main()
{
	switch ('1' - '0') //'1'과 '0'은 문자(char)지만, 컴퓨터는 문자를 아스키 코드로 저장
		//'1'의 아스키 값은 49, '0'의 아스키 값은 48
		//'1' - '0'은 49 - 48 = 1
	{
	case 1:
		printf("Hello : %d\n", 1);
		break;
	case 2:
		printf("Hello : %d\n", 2);
		break;
	case 3:
		printf("Hello : %d\n", 3);
		break;
	}
}
#include <stdio.h>
#include <conio.h>

int main()
{
    switch (_getch() - '0') //_getch()는 키보드에서 하나의 문자를 입력받아 바로 리턴하는 함수
    {
    case 1:
        printf("Hello : %d\n", 1);
        break;
    case 2:
        printf("Hello : %d\n", 2);
        break;
    case 3:
        printf("Hello : %d\n", 3);
        break;
    default:
        printf("default\n");
        break;
    }
}

반복문

#include <stdio.h>

int main()
{
  for (int i = 0; i < 5; i++)
  {
    printf("Hello\n");
  }
}
#include <stdio.h>
#include <conio.h>

int main()
{
    while (1) //조건이 항상 참이므로 계속 반복
    {
        printf("문자 입력(종료:q) : ");
        char c = _getch(); //사용자로부터 키 입력을 받음

        if (c == 'q')
            break;

        printf("Hello : %c\n", c);
    }
}
#include <stdio.h>
#include <conio.h>

int main()
{
    int run = 1; //run 변수를 1로 초기화

    while (run)
    {
        printf("문자 입력(종료:q) : ");
        char c = _getch();

        if (c == 'q')
            run = 0;
        else
            printf("Hello : %c\n", c);
    }
}
#include <stdio.h>

int main()
{
    for (int i = 1; i <= 10; ++i)
        ///++i : 반복문이 한 번 실행될 때마다 i의 값을 1씩 증가시킴
        printf("%d\n", i);
}
  • 조건문

짝수만 출력

#include <stdio.h>

int main()
{
    for (int i = 1; i <= 10; i = i + 1)
    {
        if (i % 2 == 0) //i가 짝수인지 확인하는 조건문
            //%는 나머지를 구하는 연산자
            //i를 2로 나눴을 때 나머지가 0인 경우, 짝수일 때 실행
            printf("%d\n", i);
    }
}
#include <stdio.h>

int main()
{
    for (int i = 1; i <= 10; i = i + 1)
    {
        if (i % 2 == 0)
            printf("even : %d\n", i); //짝수이면 even:숫자 형식으로 출력
        else
            printf("odd : %d\n", i); //홀수이면 odd:숫자 형식으로 출력
    }
}
```c
#include <stdio.h>

int main()
{
    int sum = 0;
    printf("sum = %d\n", sum);
    sum = sum + 1;
    printf("sum = %d\n", sum);
    sum = sum + 2;
    printf("sum = %d\n", sum);
    sum = sum + 3;
    printf("sum = %d\n", sum);
}
#include <stdio.h>

int main()
{
    int sum = 0; //sum이라는 정수 변수, 처음엔 0으로 설정
    for (int i = 1; i <= 3; ++i) //i를 1부터 3까지 반복
    {
        sum = sum + i;
    }
    printf("sum = %d\n", sum); //최종값 6 출력
}
#include <stdio.h>

int main()
{
    int sum = 0;
    for (int i = 1; i <= 10; ++i)
    {
        sum = sum + i; //각 반복바다 i를 sum에 더함
    }
    printf("sum = %d\n", sum); //반복이 끝난 후 sum출력
}
  • SumIntenger()

정수들을 더하는 기능을 하는 함수

#include <stdio.h>

void SumInteger()
{
    int sum = 0;
    for (int i = 1; i <= 10; ++i)
        sum = sum + i;
    printf("sum = %d\n", sum);
}

int main()
{
    SumInteger();
}
#include <stdio.h>
void SumInteger(int num) //num까지의 정수를 모두 더해서 출력
//void는 아무것도 반환하지 않고 내부 작업만 한다는 뜻
{
    int sum = 0;
    for (int i = 1; i <= num; ++i)
        sum = sum + i;
    printf("sum = %d\n", sum);
}
int main()
{
    int n = 0;
    scanf_s("%d", &n); //사용자로부터 값을 입력받음
    //&n은 n의 메모리 주소를 전달함, 사용자 입력이 n에 저장되도록 함
    printf("int :  %d\n", n);
    SumInteger(3);
    SumInteger(10);
    SumInteger(100);
}
  • 문자 출력
#include <stdio.h>

int main()
{
    printf("Hello\n");
    printf("integer : %d\n", 100); //%d는 정수 형식을 의미
    printf("string : %s\n", "Hello!"); //%s는 문자열을 의미
}
  • puts()
#include <stdio.h>

int main()
{
    puts("Hello"); //문자열만 출력 가능, 자동으로 줄바꿈을 해줌
    printf("integer : %d\n", 100);
    printf("string : %s\n", "Hello!");
}
#include <stdio.h>

void PrintHello()
{
    printf("Hello\n");
    printf("Hello\n");
}
//PrintHello 함수를 만들어서 Hello를 두 번 출력

int main()
{
    PrintHello();
    PrintHello();
}
//PrintHello 함수를 두 번 호출해서 총 4번 Hello를 출력
#include <stdio.h>

void PrintHello()
{
    for (int i = 0; i < 5; ++i)
        printf("Hello: %d\n", i + 1);
    puts("");
}

int main()
{
    PrintHello();
}
#include <stdio.h>

void PrintHello(int size)
{
    for (int i = 0; i < size; ++i)
        printf("Hello: %d\n", i + 1);
    puts("");
}

int main()
{
    PrintHello(2);
    PrintHello(3);
    PrintHello(10);
}
#include <stdio.h>

void PrintAdd(int a, int b)
{
    printf("%d + %d = %d\n", a, b, a + b);
}

int main()
{
    int a = 10;
    int b = 20;

    PrintAdd(a, b);
    PrintAdd(7, 5);
}
#include <stdio.h>

int Add(int a, int b)
{
    int sum = a + b;
    return sum; //Add함수에서 a와 b를 더해 그 결과인 sum을 반환
}

int main()
{
    int a = 10;
    int b = 20;
    int r = 0;
    r = Add(a, b); //결과를 r에 저장

    printf("sum = %d\n", r); //마지막으로 r값을 출력
}
#include <stdio.h>

int Add(int a, int b)
{
    int sum = a + b;
    return sum;
}

int main()
{
    int a = 10;
    int b = 20;
    int r = 0; //변수의 초기값을 0으로 설정
    r = Add(a, b);

    printf("sum = %d\n", r);
    printf("sum = %d\n", Add(1, 3));
    printf("sum = %d\n", Add(12, 12));
}
#include <stdio.h>

int main()
{
    int sum = 0;
    for (int i = 1; i <= 10; ++i) //for문을 사용하여 i가 1부터 10까지 반복
        sum = sum + i; //각 값들을 sum에 더함

    printf("sum = %d\n", sum);
}

PrintTotalInt() 함수

#include <stdio.h>

void PrintTotalInt()
{
    int sum = 0;
    for (int i = 1; i <= 10; ++i)
        sum = sum + i;

    printf("sum = %d\n", sum);
}

int main()
{
    PrintTotalInt();
}
#include <stdio.h>

void PrintTotalInt(int start, int end)
//두 개의 매개변수 start와 end를 받아 그 범위의 모든 정수의 합을 구함
{
    int sum = 0;
    for (int i = start; i <= end; ++i)
        sum = sum + i;

    printf("sum = %d\n", sum);
}

int main()
{
    PrintTotalInt(1, 100);
    PrintTotalInt(6, 7);
    PrintTotalInt(200, 300);
}
#include <stdio.h>

int TotalInt(int start, int end)
{
    int sum = 0;
    for (int i = start; i <= end; ++i)
        sum = sum + i;

    return sum;
}

int main()
{
    int sum = 0;
    sum = TotalInt(1, 100);
    printf("sum = %d\n", sum);
    sum = TotalInt(6, 7);
    printf("sum = %d\n", sum);
    sum = TotalInt(200, 300);
    printf("sum = %d\n", sum);
}
#include <stdio.h>

int main()
{
    for (int i = 1; i <= 100; ++i)
    {
        printf("%d ", i);
    }
    printf("\n");
}

짝수만 출력

#include <stdio.h>

int main()
{
  for (int i = 1; i <= 100; ++i)
  {
    if(i % 2 == 0)
      printf("%d ", i);
  }
  printf("\n");
}

PrintEvenNumber 함수를 정의하여 짝수만 출력

#include <stdio.h>

void PrintEvenNumber()
{
  for (int i = 1; i <= 100; ++i)
  {
    if (i % 2 == 0)
      printf("%d ", i);
  }
  printf("\n");
}

int main()
{
  PrintEvenNumber();
}

주어진 범위의 숫자 중 짝수만 출력

#include <stdio.h>

void PrintEvenNumber(int start, int end)
{
    for (int i = start; i <= end; ++i)
    {
        if (i % 2 == 0)
            printf("%d ", i);
    }
    printf("\n");
}

int main()
{
    PrintEvenNumber(1, 10);
    PrintEvenNumber(20, 30);
}
  • flag 함수
#include <stdio.h>

void PrintEvenNumber(int start, int end, int flag)
{
    for (int i = start; i <= end; ++i)
    {
        if (i % 2 == flag) //flag는 짝수와 홀수를 구별하는 역할을 함
            printf("%d ", i);
    }
    printf("\n");
}

int main()
{
    PrintEvenNumber(1, 10, 1); // 홀수 출력 (flag = 1)
    PrintEvenNumber(20, 30, 0); // 짝수 출력 (flag = 0)
}
#include <stdio.h>

void PrintEvenNumber(int start, int end, int isOdd)
{
    for (int i = start; i <= end; ++i)
    {
        int mod = i % 2; //mod는 나머지를 의미하는 변수, 각 숫자가 짝수인지 홀수인지 나타내는 역할을 함
        if (mod == isOdd) //mod와 isOdd 값이 일치할 때만 숫자를 출력
            printf("%d ", i);
    }
    printf("\n");
}

int main()
{
    PrintEvenNumber(1, 10, 1);
    PrintEvenNumber(20, 30, 0);
}

6주차

  • data
#include <stdio.h>
int main()
{
  int n = 10;
  printf("data : %d\n", n);
}
#include <stdio.h>
int main()
{
	int n = 10;
	printf("data : %d\n", n);
	++n; //1 증가시켜서 다시 출력
	printf("data : %d\n", n);
}
#include <stdio.h>
int Increment(int k) //매개변수 k를 받아서 무조건 11을 반환
{
	return 11;
}
int main()
{
	int n = 10;

	printf("data : %d\n", n);
	n = Increment(n); //Increment(n)을 호출해서 n에 11을 대입
	printf("data : %d\n", n);
}
#include <stdio.h>
int Increment(int k)
{
	return k + 1; //주어진 값을 1만큼 증가시켜 반환
}
int main()
{
	int n = 10; //처음에 n은 10이 출력됨

	printf("data : %d\n", n);
	n = Increment(n);
	printf("data : %d\n", n);
	n = Increment(n);
	printf("data : %d\n", n);
	n = Increment(n);
	printf("data : %d\n", n);
}
#include <stdio.h>
void PrintA()
{
	printf("PrintA()\n");
}
void PrintB()
{
	printf("PrintB()\n");
}
void PrintC()
{
	printf("PrintC()\n");
}
int main()
{
	PrintA();
	PrintC();
	PrintB();
}
#include <stdio.h>
void PrintA()
{
  printf("PrintA()\n");
}
void PrintB()
{
  printf("PrintB()\n");
}
void PrintC()
{
  PrintB();
  printf("PrintC()\n");
}
int main()
{
  PrintA();
  PrintB();
  PrintC();
}
#include <stdio.h>
void PrintA()
{
	printf("PrintA()\n");
}
void PrintB()
{
	PrintA();
	printf("PrintB()\n");
}
void PrintC()
{
	PrintB();
	printf("PrintC()\n");
}
int main()
{
	PrintA();
	PrintB();
	PrintC();
}
#include <stdio.h>

int main()
{
	int n = 10; //변수 n에 10을 할당
	int k = n; //k에 n의 값을 복사

	n = 100; //변수 n에 100을 할당, k는 여전히 10

	printf("%d %d\n", n, k);
}
  • 포인터
#include <stdio.h>

int main()
{
	int n = 10;
	int* k = &n; //k는 n의 메모리 주소를 가리키는 포인터
	//*k는 k가 가리키는 메모리 주소의 값을 의미, *k는 n의 값인 10을 출력

	printf("%d %d\n", n, *k); //n과 *k 모두 10을 출력
}
#include <stdio.h>
int main()
{
	int n = 10;
	int* k = &n;

	n = 100;

	printf("%d %d\n", n, *k);
	printf("%p %p\n", &n, k);
}
#include <stdio.h>
int main()
{
	char c = 10;
	double d = 5.6;

	char* p1 = &c; //p1은 c의 주소를 저장
	double* p2 = &d; //p2는 d의 주소를 저장

	printf("%d %g\n", c, d);
	printf("%p %p\n", p1, p2);
	printf("%p %p\n", &c, &d);
}
#include <stdio.h>
int main()
{
	char c = 10;
	double d = 5.6;

	char* p1 = &c;
	double* p2 = &d;

	printf("%d %g\n", c, d);
	printf("%d %g\n", *p1, *p2);
	printf("%d %g\n", *&c, *&d);
	//전부 주소가 아닌 정수와 실수 출력
}
#include <stdio.h>
int main()
{
	int n = 10;
	int* p = &n; //n의 주소를 저장
	int** pp = &p; //p의 주소를 저장

	printf("%d %d %d\n", n, *p, **pp); //10, 10, 10
	printf("%p %p %p\n", &n, &*p, &**pp); //주소, 주소, 주소
	printf("%p %p %p\n", &n, p, *pp); //주소, 주소, 주소
}
#include <stdio.h>
int main()
{
	double d = 4.5;
	double* pd = &d;
	double** ppd = &pd;

	printf("%g %g %g\n", d, *pd, **ppd); //4.5, 4.5, 4.5
}
#include <stdio.h>
int main()
{
	double d;
	double* pd; //pd는 double형 포인터, d의 주소를 저장
	double** ppd; //ppd는 double형 포인터의 포인터, pd의 주소를 저장

	d = 5.55;
	pd = &d;
	ppd = &pd;

	printf("%g %g %g\n", d, *pd, **ppd); //5.55, 5.55, 5.55
}
#include <stdio.h>
int main()
{
	int n = 10; //n을 10으로 초기화
	int n2 = n; //n2도 10
	int* p = &n; //p는 n의 주소를 저장
	int* p2 = p; //p2도 n을 가리킴

	printf("%d %d\n", n, *p); //10 10
	printf("%p %p\n", &n, &*p); //주소 주소
	printf("%p %p\n", &n, p); //주소 주소
}
#include <stdio.h>

int main()
{
	int n = 10;
	int n2 = n; //n의 값을 복사해서 n2에 저장
	int* p = &n; //p = &n
	int* p2 = p; //p2 = p

	*p2 = 20; //p2가 가리키는 n의 값을 20으로 변경
	printf("%d %d %d\n", n, *p, *p2); //20 20 20
}

7주차

#include <stdio.h>
void PrintData(int k)
{
	printf("data : %d\n", k); //"data : 값" 형태로 출력
}
int main()
{
	int n = 10;

	PrintData(n);
}
#include <stdio.h>
void PrintData(int* p)
{
	printf("data : %d\n", *p);
}
int main()
{
	int n = 10;

	PrintData(&n);
}
#include <stdio.h>
void PrintData(int* p) //정수 포인터를 받아서 그 주소에 저장된 값을 출력
{
	printf("data : %d\n", *p);
}
int main()
{
	int n = 10;
	int* p2 = &n;
	PrintData(&n);
	PrintData(p2); //data : 10, data : 10
}
#include <stdio.h>
void PrintData(int* p)
{
	printf("data : %d\n", *p);
	*p = 200;
}
int main()
{
	int n = 10;
	int* p2 = &n;
	PrintData(&n); //data : 10
	//*p = 200; 이 실행되기 전에 10이 먼저 출력됨
	PrintData(p2); //data : 200
}

값을 바꾸려면 포인터를 사용해야 함

#include <stdio.h>
void UpdateData(int n, int data)
{
	n = data;
}
int main()
{
	int n = 10;

	printf("data : %d\n", n);
	UpdateData(n, 200);
	printf("data : %d\n", n);
}
#include <stdio.h>
void UpdateData(int* p, int data)
{
	*p = data; //n의 값을 직접 200으로 바꿈
}
int main()
{
	int n = 10;

	printf("data : %d\n", n);
	UpdateData(&n, 200);
	printf("data : %d\n", n);
}
#include <stdio.h>
void UpdateData(int* p, int data)
{
	*p = data;
}
int main()
{
	int n = 10;
	int* k = &n; //*k = n

	printf("data : %d\n", n);
	UpdateData(&n, 50); //n을 50으로 바꿈
	UpdateData(&*k, 60); //n을 60으로 바꿈
	printf("data : %d\n", *k);
	//출력: data : 10, data : 60
}
#include <stdio.h>
void ResetData(int* p)
{
	*p = 0;
}
void PrintData(int data)
{
	printf("data : % d\n", data);
}
void IncrementData(int* p)
{
	*p = *p + 1;
}
int main()
{
	int n;
	ResetData(&n); //n을 0으로 초기화
	PrintData(n); //현재 n의 값 출력
	IncrementData(&n); //n의 값을 1 증가
	PrintData(n); //1 출력
	//출력: data : 0, data : 1
}
#include <stdio.h>
void ResetData(int* p)
{
	*p = 0;
}
void PrintData(int data)
{
	printf("data : % d\n", data);
}
void IncrementData(int* p)
{
	*p = *p + 1;
}
void SetData(int* p, int data)
{
	*p = data;
}
int main()
{
	int n;
	ResetData(&n);    // n을 0으로 초기화
	PrintData(n);      // n 출력 (0)
	IncrementData(&n); // n을 1 증가시킴
	PrintData(n);      // n 출력 (1)
	SetData(&n, 100);  // n을 100으로 설정
	PrintData(n);      // n 출력 (100)
	IncrementData(&n); // n을 1 증가시킴
	PrintData(n);      // n 출력 (101)
}
#include <stdio.h>
int main()
{
	int n = 10;
	int* p = &n; //p포인터를 사용해 n의 값을 20으로 변경

	*p = 20;

	char c = 10;
	char* p2 = &c; //p2포인터를 사용해 c의 값을 5로 변경

	*p2 = 5;

	double d = 9.99;
	double* p3 = &d; //p3포인터를 사용해 d의 값을 3.141592로 변경

	*p3 = 3.141592;
	//*p, *p2, *p3는 각각 포인터를 통해 값에 접근하여 변경
}
#include <stdio.h>
int main()
{
	// 주소의 연산 : 정수 + 정수 가감산
	int n = 10;

	printf("%p %d\n", &n, n);
	printf("%p %d\n", &n + 1, n + 1);
	printf("%p %d\n", &n + 2, n + 2);
	printf("%p %d\n", &n + 3, n + 3);
	//&n + 1: n의 주소에서 4바이트를 더한 주소
}

포인터 연산을 통해 주소가 어떻게 변경되는지 확인

#include <stdio.h>
int main()
{
	int n = 10;
	int* p = &n; //p 역시 &n과 같은 주소를 가리킴

	printf("%p %p\n", &n, p);
	printf("%p %p\n", &n + 1, p + 1); //+1은 sizeof(int)만큼 이동하는 것
	//sizeof(int)가 4바이트이므로 &n + 1은 n의 주소에서 4바이트 떨어진 메모리 위치
	//p는 n의 주소를 가리키므로 p + 1은 p가 가리키는 주소에서 4바이트 떨어진 메모리 위치
	printf("%p %p\n", &n + 2, p + 2); //&n + 2는 &n + 1에서 다시 4바이트 이동한 메모리 주소
	printf("%p %p\n", &n - 1, p - 1);
}
#include <stdio.h>
int main()
{
	// 주소의 연산 : 정수 + 정수 가감산
	char n = 10; //n은 char형 변수
	char* p = &n; //p는 n의 주소를 가리키는 포인터
	//int는 4바이트, char은 1바이트 이동

	printf("%p %p\n", &n, p);
	printf("%p %p\n", &n + 1, p + 1);
	printf("%p %p\n", &n + 2, p + 2);
	printf("%p %p\n", &n - 1, p - 1);
}
  • 배열
#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int arr[2] = { 10, 20 }; 
	//arr은 int형 배열이고 크기는 2
	//배열의 첫 번째 값은 10, 두 번째 값은 20

	printf("%d %d\n", a, b);
	printf("%d %d\n", arr[0], arr[1]);
	//배열 arr의 첫 번째와 두 번째 원소를 출력, 10 20
}
#include <stdio.h>
int main()
{
    int arr[4] = { 10, 20, 30, 40 }; //배열의 크기는 4

    printf("%d %d %d %d\n",
        arr[0], arr[1], arr[2], arr[3]);
    //배열의 인덱스는 0부터 시작
    //출력: 10 20 30 40
}
#include <stdio.h>
int main()
{
	int arr[4] = { 10, 20, 30, 40 };

	printf("size arr[2] : %d\n", sizeof(arr[2]));
	//arr[2]는 int형 변수이므로 int형의 크기인 4바이트를 출력
	printf("size array : %d\n", sizeof(arr));
	//배열 arr 전체의 크기를 출력, 4개의 int형 값을 가지므로 16바이트
	printf("%d ", arr[0]); //10
	printf("%d ", arr[1]); //20
	printf("%d ", arr[2]); //30
	printf("%d ", arr[3]); //40
	printf("\n");
}
#include <stdio.h>
int main()
{
    int arr[4] = { 10, 20, 30, 40 };

    for (int i = 0; i < 4; ++i) //배열 arr 크기만큼 반복문 실행
    {
        printf("%d ", arr[i]);
    }

    printf("\n");
}
#include <stdio.h>

int main()
{
    int arr[4];

    for (int i = 0; i < 4; ++i)
    {
        arr[i] = 10; //배열의 모든 요소에 10을 할당
    }

    for (int i = 0; i < 4; ++i)
    {
        printf("%d ", arr[i]); //배열의 각 요소 출력
    }

    printf("\n");
}
#include <stdio.h>

int main()
{
    int arr[4];

    for (int i = 0, j = 10; i < 4; ++i, j = j + 10)
        //i는 배열 인덱스, j는 10부터 시작해서 10씩 증가하는 값
        //arr[0] = 10, arr[1] = 20, arr[2] = 30, arr[3] = 40
    {
        arr[i] = j;
    }

    for (int i = 0; i < 4; ++i) //배열의 각 요소 출력
    {
        printf("%d ", arr[i]); //출력: 10 20 30 40
    }

    printf("\n");
}
#include <stdio.h>

int main()
{
    int arr[4];

    for (int i = 0; i < 4; ++i)
    {
        arr[i] = (i + 1) * 10;
    }

    for (int i = 0; i < 4; ++i)
    {
        printf("%d ", arr[i]); //출력: 10 20 30 40
    }

    printf("\n");
}

NULL

#include <stdio.h>

int main()
{
	int arr[4] = { 10, 20, 30, 40 };
	int* p = NULL; //NULL은 지금은 가리킬 게 없다는 뜻(포인터용)

	p = &arr[1]; //포인터 p는 arr[1]의 주소를 가리킴 

	printf("%d\n", *p); //p가 가리키는 값이 출력됨
	printf("%d %d %d %d\n", arr[0], arr[1], arr[2], arr[3]);
	//출력: 20, 10 20 30 40
}
#include <stdio.h>

int main()
{
	int arr[4] = { 10, 20, 30, 40 };
	int* p = NULL;

	p = &arr[0]; //p는 arr[0]의 주소

	printf("%d\n", *p);
	printf("%d %d %d %d\n", arr[0], arr[1], arr[2], arr[3]); //정수 출력
	printf("%p %p %p %p\n", &arr[0], &arr[1], &arr[2], &arr[3]); //주소 출력
	printf("%p %p %p %p\n", p, p + 1, p + 2, p + 3); //주소 출력
	//포인터끼리 더하기는 자료형 크기 단위로 이동함, int니까 4바이트 이동
}
#include <stdio.h>

int main()
{
	int arr[4] = { 10, 20, 30, 40 };
	int* p = NULL;

	p = &arr[0];

	printf("%p %p %p %p\n", p, p + 1, p + 2, p + 3); //메모리 주소 출력
	printf("%d %d %d %d\n", *p, *(p + 1), *(p + 2), *(p + 3)); //해당 주소들에 저장된 값 출력
	printf("%d %d %d %d\n", p[0], p[1], p[2], p[3]); //배열 인덱스 형식

	return 0;
}

배열을 역방향으로 탐색

#include <stdio.h>

int main()
{
	int arr[4] = { 10, 20, 30, 40 };
	int* p = NULL;

	p = &arr[3];

	printf("%p %p %p %p\n", p, p + 1, p + 2, p + 3);
	//p + 1 = arr[4], p + 2 = arr[5]

	printf("%d %d %d %d\n", p[-3], p[-2], p[-1], p[0]);
	//p[-3] = arr[0], p[-2] = arr[1]

	return 0;
}
⚠️ **GitHub.com Fallback** ⚠️