ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포인터와 배열1
    프로그래밍/C, C++ 2019. 4. 21. 23:23

    포인터와 배열

    포인터는 배열과 정말 많이 쓰인다. 이유는 잘 모르겠지만 ..
    아마 배열이 메모리 구조상 연속적으로 되어있고 배열을 함수의 인자로 넘길 수 없어
    포인터로 받아서 원하는 작업을 해야되기 때문이라고 생각한다.


    배열의 특징

    배열의 이름은 배열의 시작주소이다
    배열의 첫번째 요소는 배열의 시작주소이다.

        int arr[4] = {1,2,3,4};
        if(&arr[0] == arr) printf("Same!");

    배열이 배열전체로 쓰이는 경우는 sizeof함수& 연산자가 붙었을때 뿐이다.

        int arr[4] = {1,2,3,4};
        printf("arr배열의 사이즈 : %d\n", sizeof(arr));
        printf("arr 주소 : %x, arr[1] 주소 : %x, arr+1 값 : %x\n",  arr, &arr[1], arr+1);
        printf("&arr의 값 : %x, &arr + 1의 값 : %x\n", &arr, &arr + 1);

    실행결과

    arr배열의 사이즈 : 16 // 4바이트 * 4 = 16
    arr 주소 ּ : 62fe10, arr[1] 주소 : 62fe14, arr+1 값 : 62fe14 // arr + 1 == &arr[1]
    &arr의 값 : 62fe10, &arr + 1의 값 : 62fe20 // 차이가 16 -> 배열의 사이즈만큼 난다


    배열과 포인터

        int arr[4] = {1,2,3,4};
        int *p = arr; //배열의 이름이 시작주소

    포인터 p가 int형이기 때문에, p에 더하거나 빼면 int의 사이즈인 4바이트만큼 증가, 감소한다.
    그래서 p + 1와 &arr[1]의 주소가 같다.

    참조연산자

    참조연산자는 *인데, 선언 시에는 포인터로 쓰이고, 포인터에 *를 쓰면 주소에 있는 값을 읽는다.
    읽을 때는 선언한 자료형으로 읽는다.

        //위의 코드
        printf("*p : %d\n", *p); // 1
        printf("*(p+1) : %d\n", *(p*1)); // 2

    p가 가리키고 있는 값는 arr의 시작주소이자 &arr[0]이다!
    그래서 읽을 때, arr[0]을 읽는다 -> *와 &은 서로 상쇄가 된다.
    p = &arr[0]; 양번에 *을 붙이면 *p = *&arr[0] -> *p = arr[0] = 1이 나온다
    p + 1 = &arr[1]; 위와 같이 * 붙이면 *(p+1) = arr[1] = 2

    그렇다면 p[0]의 값은 무엇인가!?

    다음글

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

    포인터 타입 캐스팅  (0) 2019.04.30
    함수 포인터  (0) 2019.04.26
    포인터와 배열2  (0) 2019.04.21
    포인터 연산  (0) 2019.04.17
    포인터 기본  (0) 2019.04.16

    댓글

Designed by Tistory.