C언어 기초4
포인터와 배열
배열의 이름은 값을 변경할 수 없는 상수 포인터입니다.
즉 배열의 이름은 배열의 주소값을 저장하고 있는 포인터입니다.
따라서 아래와 같은 응용이 가능합니다.
int arr[3] = {10, 20, 30, 40, 50};
printf("%d %d %d %d %d\n", arr[0], arr[1], arr[2]);
printf("%d %d %d %d %d\n", *(arr +0), *(arr + 1), *(arr + 2), *(arr + 3), *(arr + 4));
// 위의 두 printf문은 같은 결과를 출력하게 됩니다. 즉 배열의 이름을 활용한 주솟값 연산이 가능하다는 것입니다.
포인터 배열
포인터 배열은 배열의 요소로 포인터 변수를 가진다.
int arr_len;
int num1 = 10;
int num2 = 20;
int num3 = 30;
int* arr[3] = {&num1, &num2, &nnum3};
그렇다면 포인터 배열과 배열 포인터는 어떻게 구별하는가?
()에 따라서 그 의미가 완전히 다르게 해석된다.
int* ptrArr[3]; //포인터 배열
int (*ptrArr)[3]; // 배열 포인터
메모리 구조
프로그래밍을 하는데 있어서 내부 구조를 이해하는 것은 중요하다. 특히 C와 같이 하드웨어와 밀접한 작업을 할 수 있는 언어는 더욱 중요하다.
일단 프로그램이 실행되기 위해서는 프로그램이 메모리(주로 우리가 말하는 DRAM)에 로드되어야 한다. 또한 이러한 프로그램에서 사용되는 다양한 데이터들도 메모리에 저장되어야 한다.
따라서 컴퓨터 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있고 다음과 같다.
- 코드(Code) 영역
- 코드영역에는 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부릅니다. 여기서 CPU가 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.
- 데이터(Data) 영역
- 데이터영역에는 프로그램의 전역 변수와 정적 변수가 저장됩니다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소명합니다.
- 스택(Stack) 영역
- 스택영역은 함수의 호출과 관게되는 지역 변수와 매개 변수가 저장되는 영역입니다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다. 이러한 함수의 정보를 스택 프레임이라고 부릅니다. 스택은 말 그대로 스택구조로 되어 있으며 푸시와 팝을 통해 데이터를 인출 삽입합니다.
- 힙(Heap) 영역
- 힙 영역은 사용자가 직접 관리할 수 있는 메모리 영역입니다. 사용자가 동적할당을 하게 되면 이 부분에 할당되게 됩니다.