윤성우의 C Programming (20) 썸네일형 리스트형 C 언어에서 배열을 초기화할 때 값을 안 넣어도 될까? 결론적으로 C 언어에서 전역 변수로 선언된 구조체 배열은 초기화 시 값을 지정하지 않아도 자동으로 0또는 NULL 로 초기화된다. 왜냐하면 전역 변수가 데이터 세그먼트에 저장되며, 이 영역의 모든 메모리는 실행 시 초기화되기 때문이다. 그러나 지역 변수로 선언된 구조체 배열은 자동으로 초기화되지 않기 때문에 값을 지정하지 않으면 쓰레기 값을 초기화 된다. 이는 프로그램의 동작을 예측할 수 없게 만들고 버그의 원인이 될 수 있다. 전역변수 구조체 배열 예제 #define _CRT_SECURE_NO_WARNINGS #include struct Point { int x, y; }; // 전역 변수로 선언된 구조체 배열 struct Point points_initialized[3] = { {1, 2}, {3, .. Chapter 22 구조체와 사용자 정의 자료형 1 (2) 2. 구조체와 배열 그리고 포인터 구조체 배열의 선언과 접근 만약 전화번호부를 작성해야 한다고 생각해보자. 전화번호부에는 여러 사람의 정보를 저장해야 하기 때문에 이를 위해서 다수의 구조체 변수를 선언해야 하고, 이때 사용되는 것이 구조체 배열이다. 구조체 배열은 기본적으로 여러 개의 구조체 변수를 연속적으로 저장할 수 있게 해준다. 이를 설명하기 전에 먼저 구조체를 어떻게 선언하는지 간단히 살펴보자. 구조체 선언 구조체는 다양한 데이터 타입을 하나의 단위로 묶어서 관리할 수 있게 해주는 툴이다. 예를 들어, 학생에 대한 정보를 저장하는 구조체를 만들고 싶다면 이름, 나이, 학점 등을 포함할 수 있다. struct Student { char name[50]; int age; float grade; }; .. Chapter 22. 구조체와 사용자 정의 자료형1 (1) 1. 구조체란 무엇인가? 구조체의 정의 엑셀의 사용자 정의 함수는 기존에 없는 함수를 사용자가 직접 만들어서 사용하는 함수이다. 구조체도 이와 비슷하다. 구조체라는것은 하나 이상의 변수(포인터 변수와 배열 포함)를 묶어서 새로운 자료형을 정의하는 도구이다. #include // 구조체 정의 struct Person { char name[50]; int age; char gender; }; 구조체 변수의 선언과 접근 Person 구조체에는 name, age,gender 변수 멤버들이 포함되어있다. 이러한 변수 멤버들의 값을 저장하는 곳이 구조체 변수이다. #include // 구조체 정의 struct Person { char name[50]; int age; char gender; }; int main().. main 함수로의 인자 전달 GTA 게임을 떠올려보자 npc에게 여러분은 종종 명령을 내린다. 예를 들어, "동쪽으로 가라", "문을 열어라", "차를 뺐어서 도망가라" 같은 명령이다. 프로그램에게 인자를 전달하는 것도 비슷하다. 여러분이 프로그램을 시작할 때 어떤 명령을 주느냐에 따라 프로그램은 다르게 동작하게 된다. main 함수는 함수가 시작되는 첫 번째 관문이다. main 함수에서는 인자를 전달받을 수 있는데 우리가 프로그램에게 이렇게 해줘, 저렇게 해줘라고 어떤 명령을 줄수 있는데 이 명령들을 "인자"라고 한다. 그리고 이 인자들은 프로그램이 시작될 때 main 함수로 전달된다. main 함수로 인자를 전달받는 일반적인 형태는 다음과 같다: int main(int argc, char *argv[]) { // 함수 본문 } .. Chapter 19. 함수 포인터와 void 포인터 함수 포인터 함수 포인터를 설명하기 위해, "초대장"이라는 비유를 사용해 보겠다. 상상해보자. 여러분이 파티에 가기 위한 초대장을 받았다. 이 초대장에는 파티 장소와 시간이 적혀 있고 파티에 가게 위해서는 이 초대장을 가지고 그 장소로 가야한다. 이제 프로그래밍 언어인 C에서의 함수 포인터를 생각해보자. 여기서 "함수"는 파티, "포인터"는 초대장과 같다. 즉, 함수 포인터는 어떤 함수로 가기 위한 "초대장"과 같은 것이다. 이 초대장(함수 포인터)을 사용하면, 그 초대장이 가리키는 함수(파티)를 실행할 수 있다.즉, 함수의 주소 값 저장을 위한 포인터 변수를 별도로 선언할 수 있으며, 이러한 용도로 선언된 포인터 변수를 가리켜 '함수 포인터 변수'라 한다.또한 배열의 이름이 배열의 시작주소 값을 의미하.. '배열 포인터' 와 '포인터 배열'을 혼동하지 말자 결론적으로 '배열 포인터'은 배열 전체를 가리키는 하나의 포인터이고 '포인터 배열' 여러 포인터를 저장하는 배열이다. 배열 포인터(Pointer to an Array) 배열 포인터는 특정 타입의 배열을 가리키는 포인터이다. 이는 배열 전체를 가리키며, 주로 다차원 배열을 다룰 때 사용된다. 배열 포인터를 사용하면, 배열의 특정 요소가 아닌 배열 전체를 가리킬 수 있어, 배열의 크기나 다차원 배열의 특정 행에 접근하는 등의 작업을 용이하게 할 수 있다. int (*ptrToArray)[5]; // 5개의 정수를 가지는 배열을 가리키는 포인터 배열 포인터 예시 #include int main() { int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; int (*ptrToArray)[3] .. 2차원 배열 arr, arr[0], arr[0][0] 의 차이 상상해 보자. arr는 전체 층이 있는 건물이고, arr[0]은 그 건물의 첫 번째 층, arr[0][0] 은 첫 번째 층의 첫 번째 방이다. arr은 건물 전체를 가리킨다. 이는 건물의 주소를 알려주는 것과 같다. 건물이 어디에 있는지 알면, 모든 층에 접근할 수 있다. arr[0]은 건물의 첫 번째 층을 가리킨다. 첫 번째 층의 주소를 알고 있다면, 그 층에 있는 모든 방에 접근할 수 있다. arr[0] 자체는 2차원 배열의 첫 번째 행을 가리키는 포인터이다. *arr과 arr[0] 은 같은 기능을 한다. arr[0][0]은 첫 번째 층의 첫 번째 방이다. 이것은 구체적인 방, 즉 첫 번째 층에 있는 특정 방의 위치와 그 안에 있는 내용물(데이터)을 나타낸. arr[0][0]을 사용하면 이 방 안에 .. 2차원 배열이름의 포인터 형 1차원 배열의 포인터형 1차원 배열의 이름은 배열의 첫 번째 요소의 주소를 나타내는 포인터로 사용될 수 있습니다. 예를 들어, int arr[10];이라는 배열이 있다면, arr은 int * 타입의 포인터로 취급될 수 있습니다. 이는 arr이 int 타입의 데이터를 가리키는 포인터임을 의미합니다. int arr[10]; int *p = arr; // 배열 이름을 포인터 변수에 할당 여기서 p와 arr는 모두 배열의 첫 번째 요소를 가리키지만, arr은 배열 자체를 나타내는 상수 포인터로, 그 크기를 변경할 수 없다. 2차원 배열의 포인터형 2차원 배열의 경우, 배열 이름은 첫 번째 행을 가리키는 포인터로 사용된다. 2차원 배열은 사실 배열의 배열로, 각 행이 연속된 메모리 블록으로 저장된다. 예를 들어,.. 이전 1 2 3 다음