<문자배열과 포인터>
문자를 배열로 저장하여 사용하는 경우도 있다. 여기서 문자란? 앞에서 배웠듯이 작은 따옴표(' ')로 이루어진 하나의 단어이다.
<실습>
-결과-
<문자열이란?>
큰 따옴표(" ")내에 포함된 하나 이상의 문자를 말한다. 문자열의 끝에는 종료를 알리는 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가 저장된 메모리 공간은 이름이 없기때문에 각 요소에 접근이 안된다.
-결과-
'Programming > C' 카테고리의 다른 글
C언어 - Call By Value(값에 의한 호출), Call by Reference(주소에 의한 호출) (0) | 2016.05.22 |
---|---|
C언어 - 포인터 변수의 상수화 (0) | 2016.05.21 |
C언어 - 포인터배열 (0) | 2016.05.19 |
C언어 - 배열 포인터 변수 (0) | 2016.05.18 |
C언어 - 2차원 배열과 1차원 포인터 변수 (0) | 2016.05.17 |