C(5)
-
[C] 문자열과 배열
다른 글에서 배열 인덱싱 연산자에 대해서 다루었다.그렇다면 왜 문자열에서는 배열과 동일하게 연산자가 동작할까 ? 아래의 코드는 정확하게 동일한 결과를 출력한다. #include int main(){ char ary[6] = "hello"; for(int i = 0; i 컴파일러의 문자열 처리컴파일러에서는 문자열 상수의 값을 문자열 배열로 처리하게 된다. 즉, 아래와 같이 표현할 수 있다. 그렇기 때문에 배열의 배열 인덱싱 연산자가 문자열 상수에서 동일하게 동작하는 것이다."hello" == char ary[6];
2024.07.28 -
[C] 배열 인덱싱 연산자
포인터는 아래와 같이 사용된다. 변수의 주소를 포인터 변수로 선언할 수 있고, 그 변수를 *를 이용해서 de-referencing하면 해당 변수의 메모리에 있는 값에 접근할 수 있다. #include int main(){ int a = 10 int *pa = &a; printf("%d", *pa); // 10 return 0;}배열은 동일한 타입의 데이터를 일렬로 저장하는 자료구조인데, 그렇기 때문에 특수하게 배열명의 이름은 배열의 첫 번째 주소의 원소를 가르키게 된다. 따라서 아래와 같이 작성하면 배열의 원소를 출력할 수 있다. #include int main(){ int ary[5] = {10, 20, 30, 40, 50}; for(int i = 0; i 아래와 같이 ..
2024.07.28 -
[C] 포인터 변수를 사용하는 swap 함수의 이해
포인터 변수를 배울 때 실패한 swap함수의 사례로 아래와 같이 작성한다.#include void swap(int* a, int* b){ printf("swap func inner value a: %d, b: %d\n", a, b); int tmp; tmp = a; a = b; b = tmp;}int main(){ int a = 10, b = 20; printf("a value: %d, b value: %d\n", a, b); swap(&a, &b); printf("a value: %d, b value: %d", a, b); return 0;}직관적으로 생각해보면 왜 위의 함수가 동작하지 않는 지 이해가 잘 안된다. swap함수 내부의 a 변수에는 m..
2024.07.28 -
[C] 왜 scanf에서는 주소값을 인자로 받는가 ?
Python, Java를 하던 사람 입장에서는 메모리와 상호작용을 직접적으로하는 저수준 언어인 C에서 생소한 개념 혹은 직관적으로 와닿지 않는 부분이 여러가지 있다. 그 중 첫 번째로 만나게 되는 것은 scanf 이다.scanf란 ? scanf는 scan formatted의 약자로 정해진 타입으로 standard input을 통해서 입력받는 함수이다. 아래와 같이 쓴다.int a;scanf("%d", &a);왜 scanf에서는 포인터를 쓰는가?C에서는 변수를 먼저 메모리에 할당하여 쓰게된다. 우리는 scanf 함수를 호출하여 std in을 받으면 그 값이 a라는 int형 변수에 할당되길바란다. 따라서 아래와 같이 사용하면 된다고 직관적으로 생각할 수 있다.int a;scanf("%d", a);하지만 이렇..
2024.07.27 -
[C] int 그리고 음수의 표현에 대한 이해
만약 아래와 같이 프로그램을 작성하면 결과가 원하는대로 나오지 않는다. #includeint main(void){ unsigned int a; a = 4294967295; printf("%d\n", a); a = -1; printf("%u\n", a); return 0;}첫 번째 a에는 -1이, 두 번째 a에는 4294967295이 찍히는데, 그 이유가 뭘까 ? C에서 int형은 4바이트만큼 메모리를 차지하게 되는데, usigned int는 0~2^32 - 1 만큼의 숫자를 표현할 수 있고, int는 -2^31 ~ 2^31 -1만큼의 숫자를 표현할 수 있다. 부호가 있는 int형의 경우, 첫 번째 비트는 부호비트로 1이면 음수, 0이면 양수를 나타낸다. 4294967..
2024.07.27