블로그 이미지
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  

Meego

2012/08/26 00:51 | Posted by JoyfulLife

앞으로 Meego 에 대한 글을 써볼까 한다. 재미있는 OS이다. 내가 바꾸고 싶은 대로 바꿀 수 있다. 빌드에 대한 부분이 있어서 좀 어려울 수 있다. 하지만.. 모.. 나는 많이 해보았으니. 이 글이 잘 검색이 되어서 사람들이 많이 찾아봤으면 좋겠다. 

I'm going to write about Meego. I can modify Meego easily. So.. I want some people to make new advanced Meego OS. Give me email fastgengy@gmail.com if you want to go with me. 


'일상' 카테고리의 다른 글

Meego  (0) 2012/08/26
"글로벌 소프트웨어"를 읽고..  (1) 2010/11/26
UX부분 홍보  (0) 2009/12/06
'10년 상반기 선발 온라인 홍보  (0) 2009/12/06
리눅스 kelp 공개 세미나  (0) 2009/11/16
그냥.. 일상..  (0) 2009/10/29

교육3일차

2011/08/25 00:22 | Posted by JoyfulLife
1. struct 은 call by value로 값을 전달한다.그래서 함수의 인자값으로 넘길 때 주소값으로 넘겨야 속도가 빠르다.
struct에서는 -> 연산자가 있다. 이것은 포인터 struct을 위한 연산자이다.

struct st
{
    int a;
    char b;
}x={10,'k};
struct st *p=&x;

라고 보자.

x.a == p->a; 는 값다.

sizeof(x) == 8


이제 배열의 등가 포인터를 보자.

2차원 배열을 보면 주소가 가리키는 타입이 중요하다는 것을 알 수 있다.

int a[3][4];

에서 a[0]이 가리키는 타입은 int*[4] 이다. a+1은 배열의 첫 요소의 ++ 이니 a의 주소의 + 4 이다.

 int (*  func(void)  )[4]
{
  static int a[3][4];
 return a;
}

void main()
{
   printf("%d",*(*(func()+1))+2);
}

가만히 보면 2차원 배열은 stack이 쌓이는 모습을 생각해야 한다. * 가 가리키는 곳과 *p+1 (*p)+1, *(p+1) 같은 것을 잘 분별해야 한다.


3.void * 는 단독으로 사용이 안되지만 어떤 타입이라도 받을 수 있다.

4.int *(*a[3])[4] 의 메모리 분석을 할 수 있을까?
a[0]과 *a[0]의 차이를 알 수 있는가?
a[0]은 int*(*)[4]를 가지고 있는 포인터이고, *a[0]은 배열을 int *[4]를 가리키는 배열이다. 때문에 *a[0]은 배열타입이다. 두 개의 값은 같지만 타입이 다르다.

5.오늘의 하이라이트 포인터 억세스 연습

#include<stdio.h>
char *c[]={"ENTER","NEW","POINT","FIRAT"};
char **cp[]={c+3,c+2,c+1,c};
char ***cpp=cp;

void main(void)
{
  printf("%s",**++cpp);
  printf("%s ",*--*++cpp+3);
  printf("%s",*cpp[-2]+3);
  printf("%s",cpp[-1][-1]+1);
}
를 푸는 것이다.
배열 안에 변수가 들어가서 좀 헷갈린다. 이것은 포인터의 개념을 확실히 알 수 잇는 문제인 것 같다.

스택을 그리고 분석을 해보자..






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

교육3일차  (0) 2011/08/25
교육2일차  (0) 2011/08/23
교육1일차  (0) 2011/08/23
포인터  (0) 2010/07/15
TAG C언어

교육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 C언어
이전 1 2 3 4 5 ... 31 다음

티스토리 툴바