C언어 포인터와 배열

    C언어 / / 2020. 1. 14. 10:13
    반응형

    12장. 포인터

    1. 포인터란 ?

     

    - 주소 값의 저장을 목적으로 선언되는 포인터 변수

    ex ) int num = 7 ;

            int * pnum ; int형 포인터 변수(pnum) 선언 

            pnum = &num ; pnum에 num의 주소 저장

     

    - 포인터 변수 또한 값을 저장하는 변수이기 때문에, int*, char*, double* 을 가리켜 포인터 형이라 한다.

     

    - 포인터 형이 필요한 이유 : 메모리 공간을 참조하는 기준이 된다.

       지정된 주소를 시작으로 몇바이트를 읽어들일지, 어떤 정수형으로 해석해야 하는지? 

     

    - 연산자 : & - 변수의 주소 값 반환 

                      *  - 포인터가 가리키는 메모리 공간에 접근

                    ex ) *pnum = 20 ; pnum이 가리키는 변수에 20을 저장하라

     

    13장. 포인터와 배열

    1. 포인터와 배열의 관계

     

    - 배열의 이름은 값을 바꿀 수 없는 '상수 형태의 포인터' 이며, 배열의 시작 주소 값을 의미한다.  arr = &arr[0] ; 

    - 배열의 포인터 형은 배열의 형과 같다.

    - 포인터를 배열의 이름처럼 사용할 수 있다.

       ex ) int * ptr = &arr[0] // int * ptr = arr 과 동일

       printf( "%d %d" , ptr[0], arr[0] ) ; // 두개의 값이 같다 - 실제로 이렇게 사용하지는 않음.

     

    2. 포인터 연산

     

    - int 형 포인터 1 증가 : 크기 4 증가

    - double형 포인터 1 증가 : 크기 8 증가

     

    3. 문자열과 포인터

     

    -  변수 형태의 문자열

    char str1[] = "My String" ;

    // str1 : 배열

    // str1 자체에 문자열 저장

    // 배열이름 str1 은 'M'의 주소값 

    // str1[0]='X' 문자열 변경 가능

     

    -  상수 형태의 문자열

    char * str2 = "Your String" ;

    // str2 : 포인터 변수

    // 포인터이름 str2 는 'Y' 의 주소값

    // 메모리 공간에 문자열 저장 -> 메모리의 주소 값 으로 자동 반환

    char * str =0x1234; 즉 문자열을 수정할 수 없음.  str2[0] = 'X' 오류

    // str2 는 가리키는 대상 변경 가능

       ex) str2 = "my string" ; 

     

    4. 포인터 변수로 이뤄진 배열 

     

    - 포인터 배열 : int * arr[3]={&num1, &num2, &num3};

     

    14장. 포인터와 함수

    1. 함수의 인자로 배열 전달하기

     

    - 인자전달의 기본방식은 값의 복사이다.

     

    - 배열의 함수를 인자로 전달하는 방식

    매개변수로 배열을 선언할 수 없음,

    배열을 통째로 전달하는것이 불가능 하기 때문에, 주소값을 인자로 전달하여 이를 통하여 접근

     

    - 배열을 함수의 인자로 전달받는 함수의 또 다른 선언

    void showArayElem( int * arr, int len){...}

    = void showArayElem( int arr[], int len){...} 아래가 배열을 인자로 전달되는 느낌을 강하게 준다! 

     

    추가적으로, 함수 내에서는 인자로 전달되니 배열의 길이를 계산할 수 없다.

    sizeof(param) 시 포인터의 크기 4 출력 , 즉 배열의 크기도 함께 전달해야 함

     

    2. 함수의 호출방식 

     

    - 값을 전달하는 형태의 함수호출 : Call-by-value ( 값의 복사 - 원본값 은 변하지 않음)

    - 주소 값을 전달하는 형태의 함수호출 : Call-by-reference ( 주소를 가져와 원본값을  변경시킴)

     

    3. 포인터 대상의 const 선언

     

    - const int * ptr = &num ; 포인터 변수가 참조하는 대상의 변경 허용 불가! 

    *ptr= 30 ; // 에러!

     

    - int * const ptr = &num ; 포인터 변수의 상수화, 주소값 변경 불가 ! 

    ptr = &num2; // 에러! 

    *ptr = 40; // 성공! 

     

    - const int * const ptr = &num ; 참조 대상 및 주소값 두가지 모두 변경 불가 ! 

     

    17장. 포인터의 포인터

    1. 이중포인터

     

    - 포인터 변수를 가리키는 또 다른 포인터 변수 

    - 주소값을 저장하는 변수

     

    ex) double num = 3.14;

    double *ptr = #

    double **dptr = &ptr ;

     

    - 포인터의 필요성은 자료구조에서 확실히 느낄수 있다!

     

     

    열혈 C 프로그래밍 참조

    반응형

    'C언어' 카테고리의 다른 글

    C언어 문자관련 함수와 버퍼  (0) 2020.01.16
    C언어 다차원배열과 포인터  (0) 2020.01.15
    C언어 자료형과 기본 출력 함수  (0) 2020.01.14
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기