ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Expert C programming
    Technician 2015. 2. 13. 15:29

    Expert C programming - Peter Van Der Linden


    회사 옮길 준비를 하고 있어서 인터뷰 준비의 일환으로  C문법 관련된 책을 읽고 있다.

    저자는 아마도 C컴파일러 관련된 작업을 했던듯 한데, C문법중 헤깔렸던 많은 문제들을

    이책에서 언급하고 있다.

    내가 혼동하던 몇가지 사항들은 아래와 같다.


    .+= vs =+

    이 연산은 A = A + B의 단축형이다, =+로 쓰는 실수를 많이 했는데, 이렇게 쓰면 =*연산이 스페이스 하나추가로

    포인터 dereferencing이된다. 실수 방지를 위해 +=, -=, *=로 정했다고.


    .if ( a = 0)

    조건문에 '=='를 '='로 쓰는 실수를 많이한다. 실수를 해도 컴파일러 에러를 유발해서 고치기

    쉽게 하는 습관으로 if( a ==0)대신 if(0 == a)가 낮다고. if(0=a)로 실수하면 컴파일시 에러가 발생한다.


    . '==' or '!=' 의 연산순위

    위 두 연산의 연산순위가 의외로 높다. (val & mask == 0) 는 (val & (mak == 0))와 같다. ((val & mak )== 0))게 아니다.

    덤으로 (c = getchar() == EOF) 는 (c = (getchar() == EOF)) 다 ((c = getchar()) == EOF) 아니라.

    연산순위는 생각보다 헤까리는 경우가 많은데 문제가 생기지 않도록 괄호를 사용하는 하여 연산의도를 명확히 하는것을 권한다고... 연산순위가 헤까리면 가로로 묶어라.


    .function pointer definition.

    질문을 하나하자. 'char *(*c[10])(int **p)' 이게 무슨 definition일까?


    해석은 아래 순서로 한다.

    char *(*c[10])(int **p) :10개 인자를 가진 배열c, 그 배열은

    char *(*c[10])(int **p) : 포인터, 그 포인터는

    char *(*c[10])(int **p) : function을 가르키고, function은 int **p type의 인자를 하나가지고

    char *(*c[10])(int **p) : return type은 char *

    결국 c는 function pointer를 인자로 10개 가지는 배열이고, c가 pointing 하는 function은 int**인 인자를 가지고 char*를 리턴함.

    내가 주로 어려워했던건, 위와 같은 definition에서 해석의 시작은 왼쪽에서 읽어서 처음 보이는 변수 이름으로 부터 시작 (위에서는 c, p가 아니라). 그리고 ()나 ( 아무 인자들)는 function이라고 해석해야 함.


    .Array vs Pointer

    Array 이름은 포인터가 아니라 어드레스 자체다. 아래 처럼 변수 정의를 했다면.

    int a[10];

    int * b;


    'b = a'는 가능하지만 'a=b'는 안된다. a는 주소를 담는 포인터 변수가 아니라 a array의 a[0]주소값이다.바꿀수도 없고 변경되지도 안는다.


    하지만 만일 function 인자로 a를 전달하면 a는 포인터 변수로 바뀌어서 전달된다. 즉 아래처럼 함수 인자로 전달된 배열은 포인터처럼 조작하는게 가능하다.

    main ()

    {

      int a[10];


      func(a);

    }


    func(int a[])

    {

      int c;

      int * b = &c;


      a = b; /* 이게 가능하다 

    }


    func(int a[])를 컴파일러는 func(int *a)로 변경하고 a라는 변수에 a[0] array 주소를 저장한다. 


    .Indexing

    아래 두 인덱싱 표현의 해석은 변수가 array of array인지 pointer array인지에  따라 다르다.


     char a[4][6];

     char * p[4];


     a[i][j] ; /*char 6개가 묶인 1차 배열중 i번째로 가서 j만큼 움직인 곳의 값

                 /* a[0] a[1]은 메모리상 연속되어 일정한 간격으로 jump함.

     p[i][j] ; /*pointer 배열중 i번째로 가서 주소를 읽고 그 주소에서 j만큼 움직인 곳의 값. 

                 /*p[0] p[1]은 메모리상 연속이 아니어도 됨.




    반응형

    'Technician' 카테고리의 다른 글

    말로 디버깅  (0) 2015.06.22
    인터뷰  (0) 2015.04.24
    Android ALooper/AMessage/AHandler 요약  (0) 2015.03.31
    가장어려웠던 Debugging  (2) 2015.02.20
    Pointing somebody  (0) 2015.01.24

    댓글

Designed by Tistory.