c언어로 간단한 계산기 프로그램을 구현해보자. 👩🏻💻 생각과정 👩🏻💻 1) 먼저 값을 나타내는 변수들과 연산자, 정답을 나타내는 변수를 설정한다. 2) scanf 문을 활용해서 사용자에게 값을 입력받는다. 3) 조건문을 활용해서 다양한 경우의 수를 확인해준다. 4) 예외 조건을 확인한다. #include #include #include #include int main(int argc,char* argv[]){ float valueOne; float valueTwo; char operator; float answer; printf("Enter calculation: \n\n"); scanf("%f %c %f",&valueOne,&operator, &valueTwo); switch(operator){ c..
*(++ptr)=20; //ptr에 저장된 값 자체를 변경 *(ptr+1)=20; //ptr에 저장된 값은 변경하지 않음 위의 두 문장 모두 현재 ptr이 가르키는 위치에서 4바이트씩 떨어진 메모리 공간에 20을 저장하는 문장이지만 연산 이후 포인터 변수 ptr에는 차이가 있다. 첫번째 문장의 경우 ++ 연산의 결과로 인해 포인터 변수 ptr에 저장된 값이 4만큼 증가한다. 하지만 두 번째 문장의 경우 + 연산으로 인해서는 ptr에 저장된 값이 증가하지 않는다. 다만 증가된 값을 연산의 결과로 얻어서 * 연산을 진행하는 것이다. 예시로 이해해보도록 하자 ! 👩🏻💻 문제 1) 길이가 5인 int형 배열 arr을 선언하고 이를 1,2,3,4,5로 초기화한 다음, 이 배열의 첫 번째 요소를 가르키는 포인터 ..

📌 1차원 배열이름의 포인터 형과 2차원 배열이름의 포인터 형 int arr2d[3][3]; 다음과 같이 선언된 2차원 배열이 있다고 가정해보자. arr2d와 arr2d[0]의 차이점은 무엇일까 ? #include int main() { int arr2d[3][3]; printf("%d \n", arr2d); printf("%d \n", arr2d[0]); printf("%d \n", &arr2d[0][0]); printf("sizeof(arr2d): %d \n", sizeof(arr2d)); printf("sizeof(arr2d[0]: %d \n", sizeof(arr2d[0])); } RESULT : 우리는 결과값을 통해 배열이름 arr2d를 대상으로 sizeof 연산을 하는 경우 배열 전체의 크기를..
📌 인자전달의 기본방식은 값의 복사이다 매개변수 전달 방법은 1) 값에 의한 전달 (Call by value) 와 2) 참조에 의한 전달 (Call by reference)로 나뉜다. 값에 의한 전달은 호출한 함수에서 잔달한 인자의 값을 복사하여 호출받은 함수의 입력 매개 변수의 초기값을 설정하는 방식이다. 즉, 호출한 곳의 인자와 피호출한 곳의 인자의 값은 같지만 메모리는 독립적이다. 반면 참조에 의한 전달은 호출한 함수에서 전달한 인자를 피호출 함수의 입력 매개 변수가 참조하여 사용하는 방식이다. 즉, 호출한 곳의 인자와 피호출한 곳의 인자는 같은 개체이다. C언어에서 매개 변수를 전달하는 방식은 값에 의한 전달 (call by value)를 사용한다. 포인터 변수처럼 메모리 주소를 값을 갖는 데이터..

💕 포인터의 포인터 포인터의 포인터는 포인터 변수를 가르키는 또 다른 포인터 변수를 뜻하는 것으로서 흔히 '이중 포인터' 또는 '더블 포인터'라고 부르며, 포인터 변수의 선언에 사용되는 * 연산자를 두 개 이어서 선언한다. int **ptr = NULL; // 이런 식으로 *를 연달아 두개 사용 ! 기본 예제 #include int main() { double num = 3.14; double* ptr = # // num의 주소 값을 저장하는 변수 ptr 선언 double** dptr = &ptr; // ptr의 주소 값을 저장하는 변수 dptr 선언 double* ptr2; printf("%9p %9p \n", ptr, *dptr); // *dptr은 ptr을 의미하니 동일한 출력값 printf..

💕 2차원 배열 int arr1[3][4]; // 세로가 3, 가로가 4인 int형 2차원 배열 int arr2[2][6]; // 세로가 2, 가로가 6인 int형 2차원 배열 정리하면 배열의 이름이 arr이고 배열요소의 자료형이 TYPE이라고 할때, 2차원 배열의 선언형태는 다음과 같다. TYPE arr[세로길이][가로길이]; 프로그램 사용자로부터 층별로 두 기구가 사는 4층짜리 빌라의 가구별 거주인원 수를 입력 받는 예제를 작성해보자. #include int main() { int villa[4][2]; //세로가 4, 가로가 2인 배열 생성 int popu, i, j; //가구별 거주인원 입력 받기 for (i = 0; i < 4; i++) { for (j = 0; j < 2; j++) { prin..
💕 call-by-value VS call-by-reference 함수를 호출할 때 단순히 값을 전달하는 형태의 함수호출을 가리켜 Call-by-value라 하고, 메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수호출을 call-by-reference라 한다. [ call-by-value VS call-by-reference] 🙌 예제 1) 변수 num에 저장된 값의 제곱을 계산하는 함수를 정의하고, 이를 호출하는 main 함수를 작성해보자. 단, 여기서는 다음 두 가지의 형태로 함수를 정의해야 한다. call-by-value 기반의 SquareByValue 함수 call-by-reference 기반의 SquareByReference 함수 SquareByValue 함수는 인자로 전달된 값의 제곱을..

💕포인터 포인터 변수란 메모리의 주소 값을 저장하기 위한 변수이다. 여기서 포인터 변수는 1) 변수 형태의 포인터와 2) 상수 형태의 포인터를 어우르는 표현이다. 💕포인터 변수 초기화 포인터 변수를 우선 선언만 해놓고, 이후에 유효한 주소 값을 채워넣을 생각이라면 '널 포인터'를 활용하는 것이 좋다. int main() { int *ptr1=0; int *ptr2=NULL; //NULL은 사실상 0을 의미 } 널 포인터는 아무데도 가리키지 않음을 뜻하기 때문에 데이터 리스크 없이 값을 초기화 할 수 있다. 💕포인터와 배열의 관계 배열의 이름은 배열의 시작 주소 값을 의미하며, 그 형태는 값의 저장이 불가능한 상수이다. 다시 말하자면 배열의 이름은 값을 바꿀 수 없는 상수 형태의 포인터이다. ✔ 예제 #i..