본문 바로가기

C언어23

C언어 전역변수 초기화 알고리즘 문제 풀 때 편의상 전역변수를 많이 사용한다. 전역 변수로 선언하면 선언 후 초기화 하지 않아도 자동으로 0으로 초기화되는 것은 알고 있었다. 사실 이거는 C언어 문법이 주제라기 보다 시스템, 운영체제 얘기에 가깝다. int a; int b = 0; 그런데 위 두 줄의 코드가 다르게 동작한다는 것은 모르고 있었다. 변수는 기본적으로 .data 섹션에 저장되는데, 초기화 되지 않은 전역변수는 .bss 섹션에 저장된다. 명시적으로 초기화 값을 주는 게 더 좋은지 나쁜지가 궁금하지만 알고리즘 문제에서 AC를 받고 못 받을 정도의 차이는 아니라서 넘어가기로 했다. 문자열, 동적 할당 : heap 초기화 된 전역 변수 : .data 초기화 되지 않은 전역 변수 : .bss 프로그램 코드 : .text 함.. 2021. 3. 30.
C언어 기초 part 2-7. 함수 포인터 함수 포인터 - 이 글을 읽는 시점에는 "C언어 기초 part 2-6. void 포인터"가 올라가지 않았을 수 있습니다. 1. 함수 포인터 함수 포인터를 이용하면 함수를 변수처럼 사용할 수 있다. 변수 뿐만 아니라 함수도 메모리 상에 저장되어 있기 때문에 포인터 변수에 저장하는 것이 가능하다. 선언 방법 : (반환형) (*변수 이름)(매개변수 타입) #include int add(int num1, int num2) { return num1 + num2; } int sub(int num1, int num2) { return num1 - num2; } int main(void) { int (*plus)(int, int) = add; int (*subtract)(int, int) = sub; printf("a.. 2020. 6. 10.
C언어 기초 part 2-5. 더블 포인터 더블 포인터 1. 더블 포인터 포인터 변수는 메모리 주소값을 저장한다. 포인터 변수를 선언하게 되면 주소값을 저장하기 위해 공간을 새로 할당한다. 당연히 그 공간에 대한 주소값도 존재하게 된다. 이 포인터 변수의 주소값을 저장하는 포인터 변수를 선언하면 그게 바로 더블 포인터가 된다. 눈치 챘겠지만 3차, 4차 이상의 다중 포인터를 선언하는 것도 가능하다. 함수에서 매개변수로 배열이 존재한다면, void function1(int arr[]) { ... } 위와 같은 형태로 존재할 것이다. 그러나 매개변수를 이렇게 선언하는 것은 프로그래머가 읽을 때 배열이라는 형태라고 생각하도록 유도하기 위함이지 실제로는 포인터로 받게 된다. 즉, 위 코드는 다음 코드로 변환된다. void function1(int * a.. 2020. 6. 1.
C언어 연재, 앞으로의 계획 번외. 조건문에서 범위 나타내기 문자열 비교하기 같은 숫자인데 거짓을 반환하는 이유 part 0. C언어 공부, 어떻게 해야할까? C언어 기초 0. content&머리말 part 1. C언어란 무엇인가? C언어 코드 맛 보기 printf() 함수 변수와 자료형 scanf() 함수 주석 C언어 연산 조건문 반복문 함수 part 2. 배열 다차원 배열 포인터 (내용 추가 예정) 문자열 오늘은 따로 강의를 작성하는 것은 아니고 뼈대를 한 번 잡아보려고 한다. 계획대로 되지 않더라도 머리속으로만 생각하는 것보다 글로 써서 눈에 보이게 정리하는 편이 나을 거라는 생각이 든다. 참고로 위의 내용들은 이미 작성된 내용들이다. part 2. ( 5. 부터 ) 더블 포인터 void 포인터 함수 포인터 part 3. 매크.. 2020. 3. 24.
C언어 기초 part 2-4. 문자열 문자열 아스키 코드 문자열 변수 문자열 입력 1. 문자열 지금까지는 숫자만을 다뤄왔다. 하지만 문자열을 다뤄야하는 경우도 많다. 문자열이란, 한 단어, 문장 혹은 그 이상의 글자를 말하고 이를 통칭하여 문자열이라 부른다. 지금부터 우리는 문자열을 변수 형태로 다루는 것이 목표다. 2. 아스키 코드 ASCII 코드는 American Standard Code Information Interchange code이다. 컴퓨터는 문자열을 그대로 받아들일 수 없다. 따라서 컴퓨터는 문자를 숫자로 바꿔서 처리한다. 각각의 문자는 숫자와 대응하게 되는데, 이것을 정리한 표가 아스키 코드 표다. 포털에서 검색하여 쉽게 찾을 수 있다. 숫자 또한 문자열의 일부라면 문자로 처리된다. 1은 숫자 1을 의미하고 '1'은 문자 .. 2020. 3. 20.
C언어 기초 part 2-3. 포인터 (20.03.27. 내용 추가) 포인터 NULL 포인터 포인터 연산 배열은 포인터다 포인터로 배열 접근 1. 포인터 포인터는 C와 C++ 언어가 갖는 특징이라고 할 수 있다. C에서는 포인터를 사용하기 때문에 컴퓨터에 대한 깊은 이해를 가능케 하고 더 빠른 프로그램을 작성할 수 있게 만든다. 대신 프로그래밍 자체에 더 오랜 시간이 걸릴 수 있고 에러가 발생할 가능성이 많다. (심지어 포인터를 사용하지 않는 언어에서도 포인터와 관련된 에러가 발생한다. null pointer exception 이 그 예이다.) 포인터란 메모리상의 주소값이다. 변수를 선언하면 그 변수를 저장할 메모리를 할당한다. 그리고 C언어에서는 그 메모리 주소값을 포인터 변수에 저장할 수 있다. 포인터 변수도 변수이기 때문에 그에 대한 주소값 또한 새로운 포인터 변수에.. 2020. 3. 3.
C언어 기초 part 2-2. 다차원 배열 2차원 배열 다차원 배열 1. 2차원 배열 2차원 배열은 배열의 확장이다. 기존의 1차원 배열이 x축만 있는 구조였다면 2차원 배열은 x, y축까지 갖는다고 보면 된다. 필자는 2차원 배열을 행렬로 생각하고 프로그래밍 한다. 즉, 논리만 맞으면 편한대로 생각해도 된다. 프로그램 상으로 4차원, 5차원 배열도 구현이 가능한데 5차원 배열을 표나 그림으로 나타낼 수는 없지 않은가? 구조는 1차원 배열과 동일하다. 메모리상에 연속적으로 할당된다. 선언 방법도 예상하다시피 int table[5][5]; 와 같이 선언한다. 필자는 이 배열은 table[행][열]로 해석한다. 메모리상에서 2차원 배열은 1행의 배열이 모두 할당되고 연속으로 2행의 배열이 할당되는 식이다. 즉, 메모리상에서 다음과 같이 정렬된다. t.. 2020. 1. 31.
C언어 기초 part 2-1. 배열 part 2. 배열과 포인터 배열 1. 배열 배열 공부에 앞서 배열이 필요한 상황, 현재로서는 해결할 수 없는 상황을 가정해 보자. 예를 들어 다음과 같은 상황이 있다. 한 한급의 인원은 30명이고 각각 수학 성적이 주어진다. 수학 성적의 평균을 구하시오. 이를 해결하기 위해 지금까지 공부한 것만을 이용하면 다음과 같은 상황이 된다. int math_score1, math_score2, math_score3, ...; 배열을 이용한다면 성질이 비슷한 여러 개의 변수를 하나의 이름으로 묶어 정의할 수 있다. 그 꼴은 다음과 같다. // 형태 1 //자료형 이름[길이]; int math_score[30]; // 길이 30만큼 메모리 공간이 할당된다. (int는 4byte이므로 4*30=120byte) // .. 2020. 1. 21.
C언어 기초 10. 함수 (part 1. 끝) 함수 전역변수와 지역변수 define const static 이번 절에서는 함수와 #define, const에 대해 알아보겠다. 1. 함수 함수는 낯설지 않은 단어이다. 누구나 중학교 수학 시간에 함수를 배웠을 것이다. 그때 배운 함수와 본질이 같다. 함수하면 어떤 생각이 드는가? y = ax+b? 코딩에서 이 표현보다는 f(x) = ax+b가 더 적절하다. 중요한 것은 함수 f(x)에 값을 대입하면 새로운 값이 나온다는 것이다. 다만, 코딩에서는 값을 대입하지 않거나 하나 이상의 값을 대입해야 할 수도 있다. 또한 새로운 값을 무조건 반환하지 않아도 된다. 함수는 다음과 같이 구성된다. 반환형 함수이름(매개변수) { ... 구현부 ... } int main(int argc, char argv[]) { .. 2019. 12. 14.