2013년 10월 28일 월요일

c언어 문자 배열을 익히자 2 (c언어 배열)



아래의 프로그램은 문자배열을 보여준다.

문자 배열은 변수선언과 초기화를 같이 하는 방법이 있다.

char a[][15] = {"abcd", "a is for apple"};

또한, 배열 포인터를 먼저 선언한 후, 초기화하는 방법이 있다.

char *a[2];         // 배열이 포인터 변수로 선언되어 있으므로, 이 변수에는 주소를 저장해야만 한다.
                           // 이는 역참조 연산자 *와 배열 연산자 [ ]의 우선순위는 배열 연산자가 앞서기 때문이다.

a[0] = "abcd"                 // a[0] == *a 이므로, a[0]는 "abcd"을 의미한다.
a[1] = "a is for apple"     /a[1] == *(a+1)이므로, a[1]]은 문자열 "a is for apple"을 의미한다.

하지만, 아래와 같이 배열로 초기화하면 컴파일할 때 에러가 난다.

char *a[2];   
a[ ] = {"abcd", "a is for apple"};   // 에러가 난다.

이는 배열의 초기화는 변수 선언에서만 유효하기 때문이다.





아래의 결과와 같이, 배열의 경우 배열명 a와 주소 연산자가 더 있는 경우 &a는 똑같은 번지(001AFD0C)를 가리키고 있고, &a[0] 또한 같다.

즉, 배열의 경우, 배열명 == &배열명 == &배열명[0]이 성립한다. 

이 경우 a == &a == &a[0]는 같이 첫번째 배열인 "abcd"의 첫 주소 001AFD0C를 저장하고 있다.

따라서 *&a[0] == a[0]는 "abcd"를 의미한다.



아래는 이를 정리하여 나타낸 것이다.

아래의 주소명은 실제 주소인 001AFDOC, 001AFD1B를 가리키며, 아래의 데이타 "abcd", "a is for apple"를 나타낸다.




여담으로, 메모리를 동적으로 할당하려면 malloc() 함수를 사용하면 아래의 프로그램도 위의 프로그램과 실행결과가 같다.

char *a[2];   

a[0] = malloc(sizeof("abcd"));
a[1] = malloc(sizeof("a is for apple"));

a[0] = "abcd";
a[1] = "a is for apple";