본문 바로가기
반응형

C언어122

[C언어] 자료형의 크기를 확인하는 방법 sizeof 함수를 사용합니다. 다양한 자료형의 크기를 출력해보겠습니다. #include int main () { char a; short b; int c; long d; long long e; printf("char: %ld \n",sizeof(a)); printf("short: %ld \n",sizeof(b)); printf("int: %ld \n",sizeof(c)); printf("long: %ld \n",sizeof(d)); printf("long long: %ld \n",sizeof(e)); } 아래는 출력결과입니다. 2022. 7. 8.
[C언어] 정수 표현 범위 쉽게 이해하기 (왜 음수가 더 많나) 4비트로 정수를 표현하면 아래 범위를 표현할 수 있습니다. $-2^3 \sim 2^3-1$ 이때 이와 같은 설명을 하는 경우가 있습니다. 맨 앞은 부호비트이므로, 실제 사용할 수 있는 비트는 3비트이다. 양수는 0을 포함해야 하므로 $2^3-1$ 까지 가능하고, 음수는 0을 포함하지 않으므로 $-2^3$ 까지 가능하다. 결과적으로 맞는 말이긴 한데 정수가 2의 보수법이라는 것을 아는 분들은 위 설명이 바로 와닿지는 않을 겁니다. 여기서는 2의 보수법을 고려하여 위 범위를 설명해보려고 합니다. 2의 보수법이 무엇이지 모르는 분들은 링크 의 글을 먼저 보고오시기 바랍니다. 아주 단순한 2비트에서 이해해봅시다. 2비트에서 1은 아래와 같습니다. $01_{(2)}$ 0은 아래와 같습니다. $00_{(2)}$ 이.. 2022. 7. 8.
[C언어] 2의 보수법 아주 쉽게 이해하기 (정수의 표현방식) 컴퓨터가 정수를 표현하는 방식을 알아봅시다. 먼저 우리가 정수표현방식을 직접 정해보고 어떤 문제가 발생할 수 있는지 경험해봅시다. 단순화하기 위해 4비트를 가지고 정수를 표현한다고 가정합시다. 정수는 양수와 음수가 있으므로 첫번째 칸을 부호로 설정해야겠다고 생각하는 것이 자연스럽습니다. 0을 양수, 1을 음수라고 합시다. 3과 -3을 표현하면 아래와 같습니다. 둘을 더해봅시다. 우리가 원하는 결과가 아닙니다. 위와 같은 표현방식을 사용할 경우 덧셈 뺄셈이 자연스럽지 않습니다. 2의 보수법의 등장 위 문제를 해결하기 위해 등장한 방법이 2의 보수법입니다. -3을 2의 보수법으로 표현하면 아래와 같습니다. 위 그림을 보고 1의 보수가 무엇인지 알겠다고 생각하실 수 있지만 아닙니다. 1의 보수는 더 복잡한 개.. 2022. 7. 8.
[C언어] 소수점 이하 원하는 자리까지 출력 (printf) printf 함수에서 실수를 출력할 때 소수점 이하 원하는 자리까지 출력하는 방법입니다. %와 lf 사이에 소수점을 찍고 자릿수를 입력합니다. 아래와 같이 입력하면, printf("%.2lf",0.5589); 0.56이 출력됩니다. 소수 셋째자리에서 반올림하여 둘째자리까지 출력됩니다. 2022. 7. 8.
[C언어] printf 는 무슨 뜻일까 printf 에서 f 는 formatted 의 줄임말입니다. printf 는 print formatted 입니다. formatted 는 '형식이 갖추어진'이라는 뜻입니다. printf 에서 숫자를 출력하는 방법은 아래와 같습니다. printf("%d",5) 이와 같이 출력할 형식을 지정해줍니다. 문자를 출력하려면 %d 대신 %c를 입력해야 합니다. %d, %c 등을 서식문자라고 합니다. 2022. 7. 8.
[C언어] 구조체 아주 쉽게 이해하기! 우리가 어떤 학급의 선생님이라고 가정합시다. 학생은 5명입니다. 이름은 아래와 같습니다. 김세모 이네모 박동글 임별 최타원 5명 학생의 정보를 관리해야 하는데요. 관리해야 하는 정보는 아래와 같습니다. 1) 이름 2) 성별 3) 키 4) 몸무게 C언어를 이용해서 위 데이터를 입력하고 싶은 상황입니다. 가장 단순한 방법은 각각의 변수를 모두 정의하는 것입니다. 예를들면 아래와 같습니다 . 김세모_이름 김세모_성별 김세모_키 ... 이와 같이 변수를 정의하면 총 5x4 개를 정의해야합니다. 더 좋은 방법이 없을까요? C언어에는 배열이라는게 있었다는 생각이 납니다. 배열을 사용해봅시다. 배열은 같은 형태의 자료형만 원소로 가질 수 있습니다. 아래와 같이 시도해볼 수 있습니다. char *박동글[4]={'박동글.. 2022. 7. 8.
[C언어] 함수의 주소를 가리키는 포인터 배열의 이름이 주소이듯, 함수의 이름도 주소입니다. 일반 포인터를 이용하여 함수 이름을 입력해봅시다. #include int add(int a,int b) { return a+b; } int main () { int *pfun; pfun=add; } 오류가 발생합니다. 포인터 변수에 함수 이름을 입력하기 원하는 아래와 같은 형식으로 입력해야 합니다. 반환형 (*포인터이름) 매개변수 위 예시를 이용하여 함수 포인터를 정의해봅시다. #include int add(int a,int b) { return a+b; } int main () { int (*pfun) (int,int); pfun=add; } 2022. 7. 7.
[C언어] 배열포인터 vs 포인터배열 포인터 배열은 포인터 역할을 하는 배열을 말합니다. 원소로 변수의 주소를 가질 수 있습니다. 예시는 아래와 같습니다. #include int main () { int num1=1; int num2=2; int * parr[2]={&num1,&num2}; } 배열 포인터는 배열 이름을 가리키는 포인터입니다. 배열 이름은 곧 배열의 주소이므로, 배열 주소를 가리키는 포인터입니다. 1차원 배열의 경우 일반 포인터 정의방법과 같습니다. #include int main () { int ar[3]={1,2,3}; int *par; par=ar; } 2차원 이상의 배열의 경우 포인터에 1을 더할 때 몇칸씩 이동할지 정해줘야 하므로 아래와 같이 정의하고, 이를 포인터배열이라고 부릅니다. #include int main.. 2022. 7. 7.
[C언어] 배열포인터 (배열을 가리키는 포인터) 1차원 배열은 포인터를 이용하여 배열을 가리킬 수 있습니다. 2차원 이상인 경우 일반 포인터로는 배열을 가리킬 수 없습니다. 이를 이해하는 것이 목적입니다. 먼저 1차원 배열을 하나 만들고 포인터로 가리켜봅시다. #include int main () { int ar[3]; int *par; par=ar; } 오류가 발생하지 않습니다. 이번에는 2행3열의 배열의 이름을 포인터 변수에 입력해봅시다. #include int main () { int ar[2][3]; int *par; par=ar; } 아래와 같은 오류가 발생합니다. ar은 3열을 갖는 배열이라서 포인터 연산을 할 때, 1을 더하면 세칸씩 이동한다는 것을 지정해주어야 합니다. 포인터 연산에서는 1을 더하면 다음 행으로 이동합니다. 다음 행이라는.. 2022. 7. 7.
[C언어] 2차원 배열의 이름 증감연산 (포인터) 2차원 배열 두개를 정의했습니다. ar1 은 3행 2열의 배열이고, ar2 는 2행 3열의 배열입니다. 1씩 더해서 주소를 출력했습니다. 배열의 이름에 주소가 저장됩니다. 배열은 포인터입니다. 첫번째 원소를 가리키는 포인터입니다. #include int main () { int ar1[3][2]; int ar2[2][3]; printf("%p \n",ar1); printf("%p \n \n",ar1+1); printf("%p \n",ar2); printf("%p",ar2+1); } 결과는 아래와 같습니다. 3행2열의 배열은 1을 더하면 8이 증가합니다. 아래와 같은 이유 때문입니다. 첫번째 원소에서 세번째 원소가 되므로 4+4 만큼 주소가 shift 되는 것입니다. 2행3열인 배열은 1을 더하면 c만큼 .. 2022. 7. 7.
[C언어] 포인터 연산 (포인터에 1을 더하면?) 아래 예시를 봅시다. 변수 var 을 정의하고, var 주소를 갖는 포인터 pvar을 정의했습니다. pvar에 1을 더한 pvar2 도 정의했습니다. var 과 pvar의 사이즈를 출력했고, pavr과 pavr2 의 주소를 출력했습니다. #include int main () { int var=1; int *pvar=&var; int *pvar2=pvar+1; printf("%ld \n",sizeof(var) ); printf("%ld \n \n",sizeof(pvar) ); printf("%p \n",pvar); printf("%p",pvar2); } 결과는 아래와 같습니다. pvar 은 인트형인데도 길이가 8입니다. 이 길이는 운영체제에 의해 결정됩니다. 주소가 출력된 것을 보면 1을 더했는데 4가 더.. 2022. 7. 7.
[C언어] 포인터 배열의 타입 배열을 하나 정의합시다. int arr[5]; arr에는 무엇이 저장될까요. arr에는 첫번째 원소의 주소가 입력됩니다. 따라서 arr의 타입은 포인터형입니다. 이번에는 포인터배열을 하나 정의합시다. 포인터배열의 원소는 변수들의 주소입니다. int *arr2[5] 배열의 이름은 포인터인데, 포인터배열인 arr2의 타입은 무엇일까요? arr2도 첫번째 원소의 주소가 입력될 것입니다. 첫번째 원소는 어떤 변수의 주소일 것입니다. arr2 에는 주소의 주소가 입력된느 것입니다. arr2는 포인터의 포인터, 즉 더블포인터입니다. 포인터배열의 타입은 더블포인터입니다. 2022. 7. 7.
[C언어] 포인터의 주소를 저장하는 더블포인터 (포인터의 포인터) 포인터는 어떤 변수의 주소를 저장하는 역할을 합니다. int num=1; int *pnum=# 이때 pnum 에는 num 의 주소가 저장됩니다. pnum 도 변수이므로 주소가 있습니다. pnum 의 주소를 저장하려고 시도해봅시다. int *ppnum=&pnum; 위와 같이 입력하면 오류가 발생합니다. 포이터의 주소를 저장할 때는 *연산자를 두개 입력해야합니다. int **ppnum=&pnum; 2022. 7. 6.
[C언어] 다차원 배열 정의하는 방법 1차원 배열의 정의 int myarr[3]={1,2,3}; 2차원 배열의 정의 int myarr[2][3]={ {1,2,3},{4,5,6} }; 또는 int myarr[2][3]={ 1,2,3,4,5,6 }; 2022. 7. 6.
[C언어] call-by-value vs call-by-reference call-by-value 는 함수에서 값을 입력받는 것을 말합니다. 일반적인 함수에서 사용하는 방법입니다. call-by-reference 는 함수에서 주소값을 입력받는 것을 말합니다. 함수 밖에서 정의된 변수 주소에 직접 접근하여 변수 값 등을 변경하고자 할 때 사용합니다. 아래 문제를 참고하세요. https://bigpicture123.tistory.com/420 [C언어 코딩문제] 함수를 이용한 배열 원소 출력 문제 배열과 자연수 n을 입력하면, 해당 배열에서 n 번째의 원소를 출력하는 함수를 정의하시오. 정답 #include void myfun(int *yourarr,int num) { printf("%d",yourarr[num-1]); } int main() { int yourarr[5].. b.. 2022. 7. 6.
[C언어] 포인터 배열을 이용한 문자열 정의 포인터 배열을 이용하면 여러개의 문자열을 쉽게 정의할 수 있습니다. 아래와 같습니다. char * parr[3]={"hi","hello","world"} 문자열이 주소값을 반환하기 때문에 가능한 정의입니다. 2022. 7. 5.
[C언어] 포인터 배열은 여러 주소를 배열로 저장한다 포인터 배열은 포인터와 배열이 합쳐진 개념입니다. 배열이 여러 변수를 한번에 저장하는데, 여기 포인터 개념이 합쳐져서 여러 주소를 한번에 저장하는 기능을 합니다. 변수 두개를 선언하고, 포인터 배열로 주소를 저장하면 아래와 같습니다. int var1=1; int var2=2; int * parr[2]={&var1,&var2}; 2022. 7. 4.
[C언어] 포인터를 이용한 문자열 정의 문자열은 보통 배열을 이용하여 정의하는데, 포인터를 이용하여 정의할 수도 있습니다. 아래와 같이 정의합니다. char * mystr = "Hello World" 이때 mystr 에는 H가 저장된 곳의 주소가 저장됩니다. 아래와 같이 출력하면 주소가 출력됩니다. printf("%p",mystr); Hello World 를 출력하려면 어떻게해야 할까요? 아래와 같이 하면될까요? printf("%s",*mystr); 안됩니다. *mystr 는 H만을 가리킵니다. 따라서 %c로 출력하면 H가 출력됩니다. Hello World 를 출력하려면 아래와 같이 하면 됩니다. printf("%s",mystr); 위와 같이 하면 H주소에 접근해서 널문자가 나올때 까지 문자열을 출력합니다. 2022. 7. 1.
[C언어] 포인터 변수가 일반변수와 다른 점 포인터변수와 일반변수와의 다른 점을 제대로 설명할 수 있어야 포인터변수를 이해한 것입니다. 포인터 변수는 어떤 변수의 주소를 입력받고, 포인터 연산자 * 를 통해서 해당 변수의 값을 받아옵니다. 이런 질문을 할 수 있습니다. 그냥 일반 변수에다가 다른 변수 주소를 입력하는거랑 뭐가 달라? 한 번 해봅시다. 아래와 같이 입력하면 될까요? int A=3; int B=&A; 일단 주소는 int 가 아닙니다. 문자열도 아니라 배열로 입력받을 수도 없습니다. 주소를 입력받을 방법이 없습니다. 포인터가 필요합니다. 2022. 6. 29.
[C언어] 배열의 이름은 포인터다 배열의 이름은 특정 값이 아니라 배열의 주소를 가리킵니다. 예를들어 아래와 같은 배열을 정의하고 배열 이름을 출력하면 주소가 출력됩니다. int myarr[3]={1,2,3}; printf("%p",myarr); 출력된 주소는 첫번째 요소의 주소입니다. %p 는 포인터의 주소를 출력할 때 사용하는 서식문자입니다. 일반적인 포인터와 다른 점은 변경이 불가능하다는 것입니다. 2022. 6. 29.
[C언어] 포인터변수에 값을 입력하면 어떻게 될까 아래와 같이 포인터 변수와 포인터변수를 정의합니다 . int num=10; int *pvar=# 이때 *pvar 에 값을 입력하면 어떻게 될까요? *pvar 에만 값이 입력될까요? 아닙니다. *pvar 이 가리키고있는 num 이라는 변수에 값이 입력됩니다. *pvar=3; 이라고 입력하면 num에 3이 입력됩니다. 2022. 6. 28.
[C언어] 포인터 관련 언산자 *와 & 의 이해 * 메모리 공간을 가리키는 연산자입니다. 포인터 변수를 정의하는데도 사용됩니다. int * pvar pvar 은 포인터 변수입니다. 포인터 변수에는 '주소'가 입력됩니다. 아래와 같이 num 이라는 변수의 주소를 포인터변수 pvar 에 입력합니다. int num=3; int * pvar = # &은 주소를 입력하는 연산자입니다. 이때 pvar 에는 num 의 주소가 입력됩니다. 아래 코드를 출력하면 num 의 주소가 출력됩니다. printf("%p",pvar); *pvar 은 pvar 에 입력된 주소에 입력된 값입니다. 아래 코드를 출력하면 3이 출력됩니다. printf("%d",*pvar); 2022. 6. 28.
[C언어] 문자열 입력받는 방법 충분히 긴 길이의 문자형 배열을 정의하고, scanf 로 입력받으면 됩니다. #include int main() { printf("문자를 입력하세요 \n"); char mystr[50]; scanf("%s",mystr); printf("입력한 문자는 %s 입니다",mystr); return 0; } 2022. 6. 27.
C언어 문자열 정의하면 길이가 하나 늘어나는 이유 (널문자) 문자열을 정의하면 길이가 하나 늘어납니다. 아래와 같이 abcde 를 정의하고 길이를 출력하면 6이 나옵니다. #include int main() { char str[]="abcde"; printf("정의한 문자열은 %s 입니다. \n",str); printf("정의한 문자열 길이는 %ld 입니다.",sizeof(str)); } 이유는 문자열 마지막에 널문자 \0이 자동으로 추가되기 때문입니다. 널문자는 문자열의 끝을 컴퓨터에게 알려주기 위해서 생성됩니다. 2022. 6. 22.
C언어 문자와 문자열 정의하기 문자 문자 하나를 정의할 때는 char 자료형을 사용하면 됩니다. 아래와 같습니다. 문자에는 작은따옴표를 사용합니다. #include int main() { char ch1='a'; printf("정의한 문자는 %c 입니다.",ch1); } 문자열 문자열 정의에는 배열이 사용됩니다. 큰 따옴표를 사용합니다. 문자열을 { } 로 정의할 때는 마지막에 널문자를 넣어줘야 합니다. #include int main() { char mystr1[]="hi hello"; char mystr2[]={'h','i',' ','h','e','l','l','o','\0'}; printf("정의한 문자열은는 %s 입니다. \n",mystr1); printf("정의한 문자열은는 %s 입니다.",mystr2); } 2022. 6. 22.
C언어 배열을 선언과 동시에 초기화하는 방법 중괄호를 이용합니다. #include int main() { int myarr[3]={1,10,100}; printf("myarr[0] 은 %d 입니다. \n",myarr[0]); printf("myarr[1] 은 %d 입니다. \n",myarr[1]); printf("myarr[2] 은 %d 입니다. \n",myarr[2]); return 0; } 2022. 6. 22.
C언어 배열이란 무엇이며, 왜 존재하며, 어떻게 정의하나 배열이란 무엇인가? 배열은 둘 이상의 변수를 모아놓은 것을 말한다. 왜 존재하나? 변수 여러개를 편하게 정의하기 위해 존재한다. 또는 문자열 정의에 사용된다. 어떻게 정의하나? 아래와 같은 형식으로 정의한다. 자료형 배열이름 [길이]; 배열을 정의하고 각 원소 값을 지정하는 예시는 아래와 같다. #include int main() { int myarr[3]; myarr[0]=1; myarr[1]=10; myarr[2]=100; printf("myarr[0] 은 %d 입니다. \n",myarr[0]); printf("myarr[1] 은 %d 입니다. \n",myarr[1]); printf("myarr[2] 은 %d 입니다. \n",myarr[2]); return 0; } 2022. 6. 22.
C언어 산술연산자 더하기 + 빼기 - 곱하기 * 나누기 / 나머지 % 2022. 6. 22.
[C언어] for문 예시 (1부터 10까지 출력) #include int main() { for (int i=1; i 2022. 6. 22.
C언어 논리연산자 1. 논리곱 (AND) 기호 : && 설명 : 양쪽 모두일 때 참 2. 논리합 (OR) 기호 : || 설명 : 둘 중 하나라도 참이면 참 3. 논리부정 (NOT) 기호 : ! 설명 : 참이면 거짓, 거짓이면 참 2022. 6. 21.
반응형