C언어 pointer


나름 포인터 어느정도 땟다고 생각해도 프로그래밍을 하다보면 끊임없이 마주치는 문제가

포인터 문제가 아닌가 싶다.

개학도 거의 다됬고 개학하면 과제도 해야하고 학과 공부도 해야 되서 막간을 이용해서

 다시 체계적으로 배우는 C언어 포인터 라는 책을 읽었다.

특별히 다시 정리해야 할 부분만 요약하면 다음과 같다.


사용자 삽입 이미지


++ , -- , & , * , type casting 단항자 등의 우선순위는 모두 같다.
우선순위가 같을때는 right to left 를 따른다.

int imsi[ 3] ; imsi와 같이 배열명은 배열의 시작위치 값을
값을 같을 가르킬 뿐이지 값을 저장할 수 없다.
즉 변수가 아니다.
따라서 imsi ++ , imsi --와 같은 연산은 할수 없다.

++변수 변수++ 의 의미
변수의 값을 1 증가시키거나(++) 감소시키는(--) 연산자로서 변수의 앞 또는 뒤에 붙여서 사용한다.
변수에 붙는 위치에 따라 의미가 극단적으로 달라지는데, 변수의 뒤에 오면
'문장의 실행이 끝난 다음에 변수를 증감시켜라'라는 의미이며,
(이거 너무 헷갈렸었다)
변수의 앞에 오면 '문장 실행 전에 변수를 증감시켜라'라는 의미이다.
그리고 반드시 변수에 사용되어어야 한다.

2차원 배열과 2차원 배열 포인터 변수 연결

int imsi[ 2 ][ 3 ] ;
int (*imsip)[ 3 ] ;
imsip = imsi ;
sizeof(*imsip) -> 4 * 3 = 12

포인터에 주소값을 할당하려 할 때 대상체를 무시한채 할당 할 수 없다.
int imsi[ 3 ] = { 3 , 4, 5 } ;
int (*imsip2)[ 2 ] = imsi -> 이건 에러다.

( imsi는 1차원 배열 , imsip2는 열이 2차원이고 열이 2차원인 배열을 가르킬 수 있다.)


//////////////////////////////////////////////////////////////
#include <iostream>

using std::cout ;
using std::endl ;

int main()
{   
    int imsi[ 3 ][ 2 ] = { 1, 3, 4, 5, 6, 7 } ;
    int (* imsip)[2] ;   
   
    imsip = imsi ;

     // 2개 모두가 같은 값을 가지고 있다.
    cout << imsip  << endl ;            //2차원 배열을 가르키는 주소            
    cout << *( imsip + 0 ) << endl ; //2차원 배열의 첫번째 행을 가르키는 주소

    int ** temp ;

    temp = new int *[ 3 ] ;

    for ( int i = 0 ; i < 3 ; i ++ )
    {
        temp [ i ] = new int [ 2 ] ;
    }

    // 다른 값을 가지고 있다.
    cout << temp << endl ;
    cout << temp[ 0 ] ;

    for ( int i = 0 ; i < 2 ; i ++ )
    {
        delete temp [ i ]  ;
    }

    delete  temp ;
}

//////////////////////////////////////////////////////////////


int (*imsi)[2]
int *temp[2]
imsi는 2차월 배열을 담을수 있는 2차월 배열 포인터 변수 이고 temp는 포인터 배열이다.
temp의 값은 바뀌지 않는다면 imsi는 2차원 배열의 주소를 가르킬수 있다.

int ** temp ; // 동적으로 할당해서 2차원 배열을 가질 수 있따.
int *temp1[2] ; // 포인터값을 저장 할 수 있는 1차원 배열
int ( * temp2)[ 2] ; //  2차원 배열값을 저장할 수 있는 2차월 배열 포인터


char * temp1 = "kin";
char temp2[] = "kin";

temp1은 포인터이기 때문에 메모리를 할당받고 temp2는 배열명이기 때문에
주소값을 할당 받을 수 없다. temp1[ 0 ] = 'a' 이건 에러다. 왜냐하면 "kin" 이 저장된
주소는 건드릴수 없는 상수 값이 저장되어 있기 때문이다.

imsi[ i ]  == * ( imsi + i )
i[ imsi ]  == * ( i + imsi )  // 이따구로 쓰는 사람 병신


NULL pointer는 0x00000000 ( 0번지 주소 ) 를 가르키는게 아니다. 어떠한 곳도 가르키지 않는 주소값을 나타낸다.

void pointer 어느 것이든 가리킬 수 있는 포인터이다.
- 어떠한 형 변환 없이도 void 형 포인터 변수에 대입이 가능하다.
- void pointer는 type casting을 한 후에 연산을 하여야 한다.

void point error

main()
{
    void imsi( void * temp ) ;
}

void imsi ( void temp [ ] )
{

}

//첨자 연산 역시 type cast가 필요하다. 첨자안에 숫자가 들어왔을때 몇 바이트씩 분기하여야 할지 알수가 없다.
신고
Comment 0 Trackback 0
Top

prev 1 2 3 4 5 6 7 ··· 10 next