Programming/C

C언어 - 문자배열과 포인터 그리고 문자열

경원구 2016. 5. 20. 09:30


<문자배열과 포인터>

문자를 배열로 저장하여 사용하는 경우도 있다. 여기서 문자란? 앞에서 배웠듯이 작은 따옴표(' ')로 이루어진 하나의 단어이다.

<실습>

 




-결과-

 




<문자열이란?>

큰 따옴표(" ")내에 포함된 하나 이상의 문자를 말한다. 문자열의 끝에는 종료를 알리는 NULL값 즉, \0이 자동으로 저장된다.

문자열 배열은 문자열을 배열에 저장하는 것을 말한다.



<실습>

 



-결과-

 

 

여기서 분명히 문자열을 넣었는데 배열로 한칸에 한문자씩 존재한다.

배열요소

"ABCD"

\0(null)

 

 

 

   

&arr[0]

&arr[1]

 

 

 

배열의 구조가 다음 표와 같이 구성된 것이 아니라 다음 표와 같이 구성되어 있다.

 

배열요소

'A'

'B'

'C'

'D'

\0(null)

   

&arr[0]

&arr[1]

&arr[2]

&arr[3]

&arr[4]

마치 다음 표와같이 존재한다는 것이다.

 

 

그렇다면 문자열배열을 문자배열로 표현할 수 있을까? 당연히 가능하다.



<실습>

 


 

-결과-

 

여기서 다른점은 널값의 유무이다. 문자열 배열은 항상 마지막에 이 문자열을 종료한다는 null값을 넣는데 문자 배열은 넣지않는다.

 

, 그렇다면 문자열 배열의 서식문자 %s에 대해 잠깐 알아보겠다. %s는 이 문자열을 보고 문자인지 문자열인지 어떻게 알 수 있을까... 바로 \0값때문이다.

%s는 문자열의 시작 주소를 입력받아서 종료 문자까지 문자열을 출력해준다.

 



<실습>

%s를 이용하여 문자열의 시작 주소를 받아서 null값을 만날때 까지 출력해보는 실습을 해보자.

 

-결과-

 

 

<포인터와 문자열>


문자열은 저장될 때, 메모리 공간에 연속적으로 저장되기 때문에 문자열의 시작주소만 알면 그 문자열의 어느부분이든 접근이 가능하였다. %s 서식문자를 이용하면 \0문자를 만나기 전까지 출력도 가능했었다. 모두 주소를 가지고 접근하기 때문이다.

주의할 사항이 잇다. 포인터와 문자열에서 포인터 변수에 문자열을 저장하게 되면 포인터는 배열이 아니라는 점!

예를 들어 char* p = "ABCD"; 이렇게 저장했다고 가정하자. 포인터 변수 p는 단순히 문자열 배열의 시작주소를 저장한 것일 뿐이지, p는 배열이 아니다.




<실습>



char arr[] = "ABCD";에서 문자열 상수 ABCD를 배열 arr에 저장하기 때문에 메모리공간의 주소가 부여되고, 배열의 요소를 통한 메모리 공간의 접근이 가능한 것이다.

하지만, 그 다음줄인 char* p="ABCD"; 같은 경우는 상수 ABCD의 시작주소를 포인터 변수 p에 저장한 것은 맞지만, ABCD가 저장된 메모리 공간은 이름이 없기때문에 각 요소에 접근이 안된다.

 

-결과-