블로그 이미지
JoyfulLife

공지사항

최근에 받은 트랙백

글 보관함

calendar

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

교육2일차

2011.08.23 21:47 | Posted by JoyfulLife
오늘 교육은
int *(*a[4])(int *) ;
를 해석하는 방법을 배우는 것이다.
저걸 해석하면 a는 int의 주소를 리턴하는 함수의 주소 4개를 요소로 하는 배열이다. 고 한다.

후치 연산을 기본으로 하면 해석은 쉽게 된다. 하지만 저걸 어디서 쓰는지 보면 별 생각이 없어진다.
저건 배열이기는 한데  어떤 요소를 담고있냐고 하면,, 함수의 주소를 담고 있는데 그 함수는 int * 인자를 넘기고 return 으로 int * 를 넘긴다.

이 정도는 할만한다.

이제 & 연산자에 대해 알아보자.


int a[4]={10,20,30,40};
일 때
a=?
*a=?
&a=?
는 무엇일까?


a==&a[0] 으로 정의된다.
이정도하면 거의 되겠지..

&a는 무엇일까?  이것은 타입이 중요하다. 타입의 예외는 sizeof와 &연산자와 함께 쓰일때만 배열 타입이 된다. 나도 설명을 하고 있지만 잘 이해가 안가는 부분이다.

우선 넘어가자.. 나중에 a+1 같은 거 할 때 좀 더 자세히 알 수 있을 것이다.

int *p,*q;
p=(int *)0x1008;
q=(int *)0x1000;

p-q 는 offset 값이 나온다.  따라서 2이다 데이터 타입은 int이다. . 곱셈 나눗셈은 에러이다.


int a[4]={1,2,3,4}
에서 &a+1 의 값은 ?
int 형은 4바이트이다. &a는 배열이기 때문에 배열의 크기는 16바이트 이다.
+1은 16바이트만큼 증가를 한다. 저기서의 +1은 int형의 1이 아니고 배열 a의 크기만큼 하나를 증가하라는 의미이다. 데이타타입에 해당하는 가장 작은 단위 만큼 증가시키라는 의미이다.


(a+1)[2] 를 생각해보자.
이것은 *(a+3) 으로 변환이 가능하다. [] 의 연산자의 의미를 잠깐 살펴볼 수 있다.



오늘의 좀 이상한 문제인
char a[4]="LEW";
char *p=a;
p는 a를 가리킨다. &p는 p의 고유의 주소를 가리킨다.
a와 &a는 같은 값을 나타낸다.

printf("%X:%X","NEW",&"NEW");
는 어떻게 될까? 같은 값은 나타낸다.

NEW를 Text영역의 RO데이타에 저장하고 그 주소값을 보여주는 것이다.
기본과정에서 이런 상급 강의는 책에서 볼 수 없다. 왜냐하면 돈이 안되기 때문이다. 하지만 이런 메모리를 알면서 코딩을 해야지 문제점을 미리 파악할 수 있을 것이다.

int a[4];
a=(int *)0x2000;
는 에러가 난다.
그 이유는 a는 Lvalue 가 될 수 없기 때문이다.
Lvalue 는 왼쪽에 놓일 수 있는 값으로 a=1; 가 가능한 것을 말한다.
배열은 lvalue 가 될 수 없기 때문에 포인터를 활용해서 lvalue로 활용을 한다.
포인터는 indirect 로 주소를 참조하기 때문에 가능한 것이다.

char err[3][25]={"11111","22222","33333333333333"};

char *err[3][25]={"11111","22222","3333333333333333"};

를 비교해보자.
메모리로는 *err이 유리하고 속도면에서 err이 유리하다.


char e[25]="11111";
char *p=e;

e[0], *p 를 비교해보면 *p이 주소를 한번 더 참조를 해야 해서 속도가 느릴 것이다.

모.. 오늘은 이런 것을 배웠다.. 생각해보면 별로 배운것 이 없는데.. 8시간 동안 배운 것인데..



신고

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

교육3일차  (0) 2011.08.25
교육2일차  (0) 2011.08.23
교육1일차  (0) 2011.08.23
포인터  (0) 2010.07.15
TAG
이전 1 2 3 4 5 6 7 ··· 91 다음

티스토리 툴바