포인터로 문자열을 선언하면 Data Segment에 저장되며 상수로 취급되고,
문자열을 배열로 선언하면 구성문자를 변경할 수 있는 변수로 취급된다
#include <stdio.h>
/* 문자열 상수와 문자열 변수 */
int main(void) {
/* 아래처럼 문자열을 배열로 선언하면 문자열을 구성하는 문자 하나하나를
* 변경할 수도 있게 되는 문자변수로 취급된다 */
char str_arr[] = "Hello World";
/* 포인터로 문자열을 선언하면 그 문자열은 Data Segment에 생성되며
* 이후에 다시 동일한 문자열을 선언하면 다시 생성하는 것이 아니라
* 해당 문자열의 주소만 넘겨 주는 방법을 사용한다 */
char *sample = "Hello World"; // Stack이 아닌 Data Segment에 생성됨
/* 아래에서 위와 동일한 문자열을 생성하지만 이미 Data Segment 에 동일
* 문자열이 생성되어 있기 때문에 그 문자열의 주소만 추출하여 전달한다
* 결국 sample, test 두 변수는 동일한 주소를 참조한다 */
char *test = "Hello World";
/* 결국 아래의 3개의 문자열 주소는 모두 동일하게 된다 */
printf("%d, %d, %d\n", "Hello World", sample, test);
/*****************************************************************/
/* 위에서 포인터로 선언한 문자열은 Data Segment에 저장되며 상수로 취급되므로
* 그 내용을 변경할 수 없게 된다.그러므로 문자열을 구성하는 문자를 수시로 변경
* 할 계획이라면 포인터로 문자열을 선언할 것이 아니라 배열을 이용해야 한다
* 즉, 아래와 같이 문자열 상수의 값을 변경하려는 경우는 안된다
sample[0] = 'A';
printf("%s \n", sample);
*/
/* 배열로 선언한 문자열은 그 구성 문자를 변경할 수 있다 */
str_arr[0] = 'h';
str_arr[6] = 'w';
printf("%s \n", str_arr);
}