ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포인터와 문자열(2)
    @ 16. 1 ~ 17. 1/C++ 2013. 1. 31. 20:24

    int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 2차원 배열을

    int (*app)[3] = arr; 2차원배열을 가르키는 포인터

    그리고..

    int arr[3] = {1,2,3}; 1차원 배열을

    일경우...

    int (*app)[3]=(int(*)[3])arr; 2차원배열을 가르키는 포인터로 변환해서..

    이런식으로하면...물론 일부에는 쓰레기값이 들어가긴하지만..

    접근시에도 app[0][1] 이런식이 가능..

     

    반대로 2차원 배열을 1차원 배열로..하면..

    int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};

    int *app = (int*)arr;

    이런식으로 형변환을 해주면..app[8]로 접근이 가능하다.


    int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};

    int (*app)[3] = arr;

    에서 app + 1일경우(2차원 메모리)

    app[1]과 같다.

    그럼 app[1]+1은?(1차원 메모리)

    app[1][1]와 같다.

    그럼 app[1][1]+1은?(값)

    app[1][1]의 값에 +1한 값이다.

     


    문자열이란?

    \n 문자를 포함한 문자의 집합

    첫 글자의 시작주소만 기억하면 문자들이 연속적으로 저장되어 있으므로 모든 문자에 접근이 가능하다.

    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' 가능)

     

    잠깐 정리!
    1 : 정수를 의미하며 정수 10진수이다.  일 숫자

    '1' : 한 문자를 의미하며 ASCII 코드 정수 49이다. 일 문자

    "1" : 문자열을 의미 메모리에는 '1'문자와 '\n'문자가 저장되어 있음(문자열의 시작주소를 char *포인터에 저장함)

    '' : 문자를 포함하지 않으므로 컴파일 오류(공백도 문자다)

    ' ': 공백문자를 포함하였으므로 ASCII 32이다.

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

    " " : 공백을 포함한 문자열

     

    '@ 16. 1 ~ 17. 1 > C++' 카테고리의 다른 글

    포인터 정리(4)  (0) 2013.01.31
    void 형 포인터 및 함수 포인터(3)  (0) 2013.01.31
    배열(1)  (0) 2013.01.29
    포인터(1)  (0) 2013.01.29
    Template (3) 클래스 템플릿 특수화  (0) 2013.01.29
Designed by Tistory.