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

교육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

티스토리 툴바