본문 바로가기

programming language/C 언어

상수 형태의 문자열을 가리키는 포인터

마지막에 널 문자가 삽입되는 문자열의 선언방식

1. 배열을 이용하는 방식.

2.char형 포인터 변수를 이용하는 방식.

 

배열을 기반으로 하는 문자열의 선언

char arr[ ] = "I love";

이는 배열을 기반으로 하는 '변수 형태의 문자열' 선언이다. 변수라 하는 이유는 문자열의 일부를 변경할 수 있기 때문이다. 

 

포인터를 기반으로 하는 문자열 선언

char * arr2 = "my house";

위와 같이 선언을 하면, 문자열 "my house"가 메모리 공간에 저장되고, 문자열의 첫번째 문자 m의 주소값이 반환된다. 

그리고 그 반환값은 포인터 변수 arr2에 저장된다. 

 

둘의 차이:  배열이름 arr은 계속해서 문자 I가 저장된 위치를 가리키는 상태여야 하지만, 포인터 변수 arr2는 다른 위치를 가리킬 수 있다. 예를 들어서, arr은 I가 Y로 바뀌어도 그자리 그대로 가리키고, 다른 문자열을 입력받아도 현재 가리키는 I의 위치만을 가리킨다.

 

반면에, arr2는 변수형태의 포인터 이기에 아래와 같은 코드 작성이 가능하다. 

#include<stdio.h>
int main(void)
{
		char* arr2 = "like";
		arr2 = "go home";
		printf("%s", arr2);
	return 0;
}

 

하지만, 배열이름인 arr은 상수형태의 포인터이기 때문에, 위의 코드와 같이 가리키는 대상을 변경할 수 없다.

가리키는 대상을 변경한다는 것은 다른 문자열을 입력 받는다는 것이 아니라 다음과 같은 것이다.

like ←를 가리키던 것이 →go home을 가리킨다는 것이다. 즉 두 곳의 주솟값이 다르다.

 

char arr[ ] = "I love"; 와 같이 선언이 되면 문자열은 배열에 저장이된다. 그리고 배열을 대상으로는 값의 변경이 가능하기 때문에 '변수 형태의 문자열' 이라한다.

 

char * arr2 = "my house"; 와 같이 선언이 되는 문자열은 '상수 형태의 문자열' 이라 한다. 그리고 포인터 변수 arr2가 가리키는 문자열은 그 내용의 변경이 불가능 하다. 

 

 

<참고>열혈 c 프로그래밍 p303 참조 

char * str = "const string"; 이와 같이 선언되는 문자열은 상수 형태의 문자열이고, str은 변수 형태의 포인터 이다.

먼저, 위의 문장이 실행이되면 문자열이 메모리공간에 저장이된다. 그리고 메모리 주소 값이 반환된다.

즉, 문자열이 0x1234번지에 저장되었다 가정하면, 위의 코드는 문자열이 저장된 이후에 아래와 같이 된다.

char * str = 0x1234;  그리하여 포인터 변수 str에 문자열의 주솟값 0x1234가 저장이 되는 것이다.

 

함수의 호출과정에서 선언이되는 문자열도 위와 같이 처리가 된다.

printf("my love");의 경우에는 " "사이에 묶여서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장된 후 그 주소 값이 반환된다. 따라서 함수호출문도 메모리 공간에 문자열이 저장된 이후에 printf(0x1234); 와 같은 형태가 된다.(주솟값 0x1234로 가정.) 그러므로 printf함수는 문자열을 통째로 전달 받는 함수가 아니라, 문자열의 주솟값을 전달 받는 함수라는 것을 알 수 있다.

출처: 윤성우 열혈 c 프로그래밍(p303)에서 인용