성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • 문자열 나누기
  • WINAPI
  • ARM Reverse Engineering
  • Boot Code 분석
  • MFC

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

2013.10.18_문자열변수와 문자열상수의 구분
C++프로그래밍

2013.10.18_문자열변수와 문자열상수의 구분

2013. 10. 18. 17:39

■ 문자열을 표현하는 방법은 크게 두가지가 있다.

char str1[5] = "abcd";   //문자열 변수
char *str2 = "ABCD";    //문자열 상수


(1) 문자열 변수
: 자료형 char형인 str1이라는 이름의 배열을 선언하고, 대입 연산자 오른쪽에 선언된 문자열을 저장하고 있다.
  따라서 str1이 저장하고 있는 문자열은 변수가 된다.

  [      a      |      b      |      c      |      d      |      \0      ]
      str1[0]       str1[1]       str1[2]        str1[3]       str1[4]



(2) 문자열 상수
: 대입 연산자의 왼쪽에 char형 포인터를 선언하고, 오른쪽에는 "ABCD"라는 문자열을 선언하고 있다.
  이는 포인터 str2를 이용해서 문자열 상수"ABCD"를 가리키겠다는 의미가 된다.
  따라서 str2는 문자열의 첫 문자 'A'를 가리키게 된다. 포인터의 타입이 char*인 이유도 여기에 있다.

  [●]-----------------> [ A B C D \n ]
 포인터                               문자열 상수

배열 str1은 문자열 전체를 저장하고 있는 것이고,
포인터 str2는 메모리에 저장되어 있는 문자열 상수 "ABCD"를 단순히 가리키고만 있다.


 예시 

#include <stdio.h>


int main()
{
  char A[10] = "ABCDE";
  char* B = "QFGS";
  int i;
  
  for(i=0;i < 10 ; i++)
  {
    printf("%c ", *(A+i));   // 문자열의 첫번째 문자의 주소에서 부터 한자씩 출력한다.
  }
  
  putchar('\n');
  putchar('\n');

  for(i=0;i < 10 ; i++)
  {
    printf("%c ", *(B+i));  // 문자열의 첫번째 문자의 주소에서 부터 한자씩 출력한다.
  }

  putchar('\n');
  putchar('\n');

  printf("%s\n", A);        
  printf("%s\n\n", B);      // B 같은 경우, 형식지정자를 %s 를 사용하면 그곳의 주소로 찾아가 하나씩 출력한다.

  printf("%p\n", &A);       // 같은 메모리 부근을 사용하고 있다.
  printf("%p\n", &B);

  return 0;
}

 



 

 : 




- str1은 문자열 변수이고, str2는 문자열 상수 이다.
- str1이 가리키는 문자열은 변수 이므로 문제가 없지만, str2가 가리키는 문자열은 상수이므로 변경 시 문제를 일으킨다.

(3) 문자열 상수에 대한 이해
: 문자열 상수는 메모리 공간에 할당되면 주소를 반환한다.

char *str = "ABCDEFG"

- char형 포인터를 선언하고 있고, 대입연산자 오른쪽에 주소값이 오기를 기다린다.
- 하지만 주소값이 아닌 문자열 상수가 선언되어있다.
- 이는 문자열 상수는 메모리 공간에 저장되면, 그 순간에 문자열 상수의 주소 값이 반환됨을 말한다.
- 문자열 상수의 주소는 문자열의 첫 번째 문자의 주소이므로, char형 포인터 타입이다.

=> 문자열 상수 "ABCDEFG"가 0x10번지에 저장이 된다면, 주소값 0x10이 반환되어 포인터 변수 str을 초기화 하게 된다.

저작자표시 (새창열림)

'C++프로그래밍' 카테고리의 다른 글

2013.11.14_ 상속(Inheritance) _ 예제 실습  (0) 2013.11.14
[2013.11.01] C++ _ 자료형과 연산자  (0) 2013.11.01
2013.05.27_pragma pack() 에 대해서_팁  (0) 2013.05.27
2013.05.22_ARM칩 Library에서 끌어쓰기  (0) 2013.05.22
2013.05.20_Timer/Counter_AIC__풀업풀다운.  (0) 2013.05.20
    'C++프로그래밍' 카테고리의 다른 글
    • 2013.11.14_ 상속(Inheritance) _ 예제 실습
    • [2013.11.01] C++ _ 자료형과 연산자
    • 2013.05.27_pragma pack() 에 대해서_팁
    • 2013.05.22_ARM칩 Library에서 끌어쓰기
    성엽이
    성엽이

    티스토리툴바