목록Programming (115)
Nagie's DevStory
문자열이란 문자를 여러 개 이어 붙인 형태의 자료이며 문자열을 저장하기 위해선 연속적인 메모리 공간이 필요하다. 즉 배열이 필요하다는 의미이며 C에서 지원하는 문자열 방식은 총 2가지가 있다. 1. char 타입의 배열을 선언 후 문자열 삽입 2. char 타입의 포인터를 선언 후 문자열 리터럴을 해당 포인터에 할당 문자열을 다루는 방법의 예시는 아래와 같다. char str[17] = "C Style String 1"; //배열타입 1 char str[] = "C Style String 2"; //배열타입 2 char* str1 = "C Style String 3"; //리터럴 시작 부분의 메모리 주소를 포인터변수에 할당 const char* str2 = "C Style String 4"; //문자열 ..
일차원 배열과 이차원 배열의 확장되는 개념이지만 잘 사용하진 않는다. 다차원 배열은 기존의 이차원 배열의 기본 구성인 행(Row), 열(Column)에서 면(Side)이 추가되는 개념이며 이 역시 사람이 접근하기 편하게 하기 위해 고안된 것이다. 실제 메모리 공간에선 하나의 연속된 공간으로 구성된다. 다차원 배열의 선언 방법은 아래와 같다. //다차원 (3차원)배열 선언방법 int MyArr[5][5][5]; //int MyArr[면의 개수][행의 개수][열의 개수]; 위의 작성법대로 int MyArr[5] [5] [5];를(을) 선언한다면 아래의 사진처럼 메모리 공간이 구성된다고 생각하면 된다. 거대한 큐브 모양처럼 말이다. 다차원 배열 역시 기존의 일차원 배열과 이차원 배열처럼 초기화가 가능하다. 다..
기존 배열에서 확장된 개념이다. 사람이 이해하기 쉽게 행(Row) , 열(Column) 개념을 사용한다. 코드로는 아래처럼 표현한다. //이차원 배열 int MyArr[3][5]; int MyArr[행의 갯수][열의 갯수]; 초기화 방법은 일차원 배열과 동일하게 가능하다. 다만 선언과 초기화를 같이 할 때 중괄호를 사용해 초기화하는 방법이 조금 다르며 이차원 배열의 원소 접근 방법이 일차원 배열과는 다르게 행열을 둘 다 기재해 접근한다. //이차원 배열의 선언과 초기화 int MyArr[2][3] = { {1,2,3} , {4,5,6} }; int MyArr[][3] = { {1,2,3} , {4,5,6} }; //행의 갯수는 생략 가능하지만 열의 갯수는 생략 불가 int MyArr[2][3] = { 1..
포인터의 일정 부분은 알았으니 조금 독특한 포인터를 알아보는 것도 나쁘지 않아 보인다. 포인터도 자료형을 정할 수 있었다. 예를 들어 int* ptr;이면 int 타입의 변수 메모리 주소를 담을 수 있다는 의미 정도인데 C에는 void 형 포인터라는 게 있다. 이 녀석은 void라는 단어 뜻처럼 데이터형이 정해지지 않은 형태의 포인터 변수이고 데이터 타입을 따지지 않고 해당 변수의 메모리 주소를 저장만 한다. 그래서 void 포인터로 해당 변수에 접근하려면 형 변환(Type Casting)을 해줘야 한다. //void 포인터 변수 void* Ptr; //void 포인터로 접근 *(int*) Ptr; 그리고 NULL 포인터라는 아무것도 참조하지 않는 포인터가 존재하는데 주로 저장하는 값은 nullptr 즉..
포인터와 배열의 상관관계까진 알았는데 이걸 왜 써야 해? 라는 궁금증이 생길 수도 있다. 이 글을 작성하고 있는 나도 그런 생각을 했기 때문이다. 이 궁금증을 해결하려면 한가지의 실험을 해봐야 한다. 우선 아래의 코드를 작성해서 결과를 보자. #include void swap(int a , int b) { int temp = a; a = b; b = temp; } int main() { int a = 10, b = -1; swap(a,b); printf_s("a : %d\nb : %d",a,b); } 해당 코드는 a와 b의 값을 서로 바꿔주는 코드다. 과연 이 코드가 제대로 작동할까? 한번 생각해 보자. 결론부터 말하자면 main()에 선언된 변수 a,b의 값은 바뀌지 않는다. 왜 그런지 아래의 사진을 ..