ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 문자열 관련
    @ 16. 1 ~ 17. 1/면접관련 2017. 1. 4. 19:18

    char *cp = "ABCD";

    이런식이면..

    cp[0], cp[1], cp[2] 이런식으로 접근이 가능함..

    *cp = "ABCD"의 뜻은 포인터 변수에 문자열을 저장하라가 아니라..

    문자열의 시작주소(예:123123)를 포인터 변수에 저장하라는 의미이다.

    또한 배열로도 가능하다.

    char p[10] = "ABCD";

    배열도 연속적인 메모리이기 떄문에 가능하다.

    근데..*cp의 문자열은 상수영역의 메모리에 저장되서 수정이 불가능하고(cp[0]='z' 불가능)

    p[10]은 변수 영역이므로 변경이 가능하다.(p[0]='z' 가능)


    "" : 문자열을 의미하며 메모리에는 '\n' 문자가 저장되어 있고 문자열의 시작주소를 char * 포인터네 저장가능함..즉 널문자






    문자열 포인터

    문자열 리터럴(문자열 상수) : 큰 따옴표로 둘러싸인 문자의 배열(이것은 문자열 리터럴 풀에 위치함)

    문자열 리터럴은 함께 사용되어 null로 끝나는 문자열을 형성하는 문자 시퀀스를 나타냅니다. 문자를 큰따옴표로 묶어야 합니다. 다음과 같은 종류의 문자열 리터럴이 있습니다

    const char *narrow = "abcd";

    // represents the string: yes\no
    const char *escaped = "yes\\no";

    문자열 리터럴은 상수이므로 이를 수정하려고 하면(예: narrow[2] = 'A') 컴파일러 오류가 발생합니다

     


     

    이외 초기화할때 발생하는것...

    char header2[];

    header2="MEdia" 이건 아님..문자열의 주소를 배열 변수의 이름에 할당이 안됨..

    초기화할떄 하던가(char header2[]="MEdia") 공간을 주고 strcpy하던가 (char header2[10]; strcpy(header2, "MEdia"), 공간주고 하나씩 넣던가 (header2[0]='M';)

     

    두개의 문자열을 비교할떄 사용되는 잘못된 방법

    char str[10]

    if(str=="abc")

    이것은 str주소와 문자열 상수의 주소를 비교하는것임..값을 비교하는게 아니라..

     

    하나의 포인터를 다른 포인터에 할당한다고 하여 문자열이 복사되는 것은 아니다.

    이는 단순히 문자열의 주소를 복사한 것 뿐..

    char *str[30];

    str[29]="abc";

    str[30]=str[29];

    포인터만 복사됨..문자열은 복사 안됨 같은 리터럴 문자열을 참조함..

     

    함수 안에서 문자열을 반환하려고 할때. 2가지

    1) 정보를 채울 빈 버퍼를 전달하고 함수가 버퍼를 다시 반환(함수를 호출하는 쪽에서 버퍼를 해제)

      (1) 버퍼의 주소와 크기를 전달해야함

    2) 함수 내에서 동적으로 버퍼를 할당 반환(이것은 함수를 호출하는 쪽에서 함수가 어떻게 사용될지 완전히 이해해야함. 메모리 누락 땜시..)

    보통은 포인터로 매개변수, 반환 다 함..(문자열 주소)



    출처: http://namoeye.tistory.com/entry/Understanding-and-Using-C-Pointers%EC%A0%95%EB%A6%AC [Develop]

Designed by Tistory.