목록C언어 (12)
juuuding
1. C언어의 메모리 구조 1. 메모리의 구성 프로그램 실행 시 운영체제에 의해 마련되는 메모리 구조는 다음과 같이 네 개의 영역으로 구분이 된다. 그 이유는 유사한 성향의 데이터들을 묶어서 저장하면, 관리가 용이해지고 메모리의 접근 속도가 향상되기 때문이다. 2. 메모리 영역별로 저장되는 데이터 유형 [코드 영역] 실행할 프로그램 코드가 저장되는 메모리 공간이다. CPU는 코드 영역에 저장된 명령문들을 하나씩 가져가서 실행한다. [데이터 영역] 전역변수와 static 변수가 할당된다. 프로그램의 시작과 동시에 메모리 공간이 할당되어 프로그램 종료 시까지 남아있게 된다. [스택 영역] 지역변수와 매개변수가 할당된다. 함수를 빠져나가면 소멸된다는 특징이 있다. [힙 영역] 데이터와 스택영역에 있는 데이터들..
1. 구조체의 정의와 typedef 선언 1. typedef 선언 typedef 선언은 기존에 존재하는 자료혀으이 이름에 새 이름을 부여하는 것을 목적으로 하는 선언이다. typedef int INT // int의 또 다른 이름 INT 부여 즉, 자료형의 이름 int에 INT라는 이름을 추가로 붙여준다는 의미다. 따라서 위의 선언 이후로는 다음 형태로 int형 변수를 선언할 수 있다. INT num; //int num; 과 동일한 선언 그리고 typedef로 정의되는 자료형의 이름은 대문자로 시작하는 것이 관례이다. 2. 구조체의 정의와 typedef 선언 대부분 구조체 이름을 대상으로 struct 선언의 생략을 위한 typedef 선언이 등장한다. typedef struct point { int xpo..
1. 구조체란 무엇인가? 1. 구조체의 정의 '구조체'란 하나 이상의 변수(포인터 변수, 배열 포함)를 묶어 새로운 자료형을 정의하는 도구이다. 독립된 정보가 아닌 함께 있어야 의미를 지니는 변수들을 묶기 위해 등장한 것이 구조체이며, 다음과 같이 구조체를 정의함으로써 여러 변수를 하나로 묶을 수 있게 된다. struct person { char name[20]; char phoneNum[20]; int age; }; 이 때 person이라는 이름이 int나 char과 같은 자료형의 이름이 되는 것이다. 이는 기본 자료형은 아니며 기본 자료형 변수를 묶어서 새로운 자료형을 만든 것이다. 이를 가리켜 '사용자 정의 자료형'이라 한다. 2. 구조체 변수의 선언과 접근 위에서 person이라는 이름의 구조체를..
1.스트림과 데이터의 이동 1. '입력'과 '출력'은 무엇인가? 프로그램 중심으로 프로그램 안으로 데이터가 흘러들어오는 것이 입력이고, 프로그램 밖으로 데이터가 흘러 나가는 것이 출력이다. 대표적인 입력 장치로는 키보드가 있고, 파일도 입력의 대상이 될 수 있다. 그리거 대표적인 출력 장치로는 모니터가 있고, 파일도 출력의 대상이 될 수 있다. 마우스, 프린터, 화상 카메라와 같은 장치들도 입출력 장치에 해당한다. 2. 데이터의 이동 수단이 되는 스트림 모니터와 키보드를 대상으로 데이터를 입출력 하기 위해서는 이들을 연결시켜주는 다리가 필요한데, 이 다리 역할을 하는 매개체를 '스트림(stream)'이라고 한다. 따라서 prinft 함수와 scanf 함수로 데이터를 입출력 할 수 있는 근본적인 이유는 스..
1. 함수 포인터와 void 포인터 1. 함수 포인터이 이해 함수는 매모리 상에 저장된 함수의 주소 값을 의미한다. 배열의 이름이 배열의 시작주소 값을 의미하듯, 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미한다. 배열의 이름과 마찬가지로 함수의 이름도 그 형태가 상수이다. 함수 이름의 포인터 형은 반환형과 매개변수의 선언을 통해서 결정짓도록 약속되어 있다. int SimpleFunc (int num){}의 포인터 형을 말하자면 "반환형이 int이고 매개변수로 int형 변수가 하나 선언된 포인터 형이다," 2. 적절한 함수 포인터 변수의 선언 함수의 포인터 변수에는 반환형 정보와 매개변수 선언의 정보가 모두 표현되어 있어야한다. 따라서 다음과 같이 작성하여 함수 포인터 변수를 선언한다. "i..
1. 2차원 배열이름의 포인터 형 1. 1차원 배열이름의 포인터 형과 2차원 배열이름의 포인터 형 int arr[10]과 같은 1차원 배열이름 arr의 포인터 형은 int형 포인터이다. 그리고 앞서 int* parr[20]의 parr이 int **형 포인터임을 배웠다. 따라서 2차원 배열의 이름이 더블 포인터 형이라는 오해를 절대로 해서는 안 된다. 2. 2차원 배열이름이 가리키는 것들은? int arr2d[3][3]과 같은 2차원 배열에서, 배열이름 arr2d가 가리키는 것은 인덱스 기준으로 [0][0]이다. 더하여 2차원 배열의 경우에는 arr2d[0], arr2d[1], arr2d[2]도 의미를 갖는데, 각각 1행 2행 3행의 첫 번째 요소를 가리킨다. 이처럼 arr2d와 arr2d[0]의 출력 값..
1. 포인터의 포인터에 대한 이해 1. 포인터 변수를 가리키는 이중 포인터 변수 (더블 포인터 변수) 포인터 변수는 종류에 상관없이 무조건 주소 값 저장하는 변수이다. 포인터 변수도 메모리 공간에 할당이 되는 변수인데, 이를 대상으로 &연산이 가능하며 이 때 반환되는 주소 값은 'double 포인터 변수'에 저장이 가능하다. "ptr = &num" 이고 "double ** dptr = &ptr" 이면 *dptr은 변수 ptr을 의미하고 **dptr은 변수 num을 의미한다. int main(void) { double num = 3.14; double* ptr = # double** dptr = &ptr; double* ptr2; printf("%9p %9p\n", ptr, *dptr);//둘 다 ..
1. 다차원 배열의 이해와 활용 1. 다차원 배열을 대표하는 2차원 배열의 선언 int arr1[3][4]; -> 세로3, 가로 4인 int형 2차원 배열 int arr2[2][6]; -> 세로2, 가로 6인 int형 2차원 배열 [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] TYPE arr [세로길이][가로길이]; sizeof(arr1)의 결과 : 3*4*4 = 16 2. 2차원 배열의 메모리상 할당의 형태 우리가 사용하는 컴퓨터 메모리는 2차원 구조가 아니다. 이는 메모리 주소 값을 통해 알 수 있다. 우리가 사용하는 메모리의 주소 값은 다음과 같이 1차원적 구조이다. " 0x1001번지, 0x10..