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);
}
- 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
}
#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;
}