포인터 해석
int *list1;
int list2[5];
list2 | &list2[0] |
list2 + i | &list2[i] |
(list2 + i) | &list2[i] |
*(list2 + i) | list2[i] |
if(i == 2) list2[i] | a+2*sizeof(int) |
list2[2] → a+2*4 // a : 임의의 주소 값 |
역참조
- list[i]
- "=" 기호 우측 : (list + i)가 가리키는 값
- "=" 기호 좌측 : 값을 (list+i)에 저장
일차원 배열의 주소 계산
- prt+i → 주소
- *(prt + i) → 가리키는 값
void print1(int *prt, int rows){
int i;
for(i=0; i<rows; i++){
printf("%u %d", prt+i, *(prt+i));
}
}
1차원 배열
int *pt;
int list[5] = {10, 20, 30, 40, 50};
pt = &(list[0]);
index | value | |||
pt | 2004 | list[4] | 50 | |
0 | 10 | *(list+4) | 50 | |
1 | 20 | *pt | 10 | |
2 | 30 | *(pt+4) | 50 | |
3 | 40 | pt[4] | error(x) → 50 | |
4 | 50 | * pt = list로 동등하게 생각! |
struct
다양한 타입의 변수의 집합
- int, float ...
- *pt
- array, struct
- user define
typedef struct humanBeing{
char name[10];
int age;
float salary;
}humanBeing; //구조체 별칭
humanBeing p1, p2;
pq.age = 20;
p1.salary = 30;
strcpy(p1.name, "Jang");
// + p2 = p1 → 컴파일 따라 가능할수도 불가능할수도
// 별칭을 지정하지 않는 경우
struct humanBeing{
char name[10];
int age;
float salary;
};
struct humanBeing p1;
// typedef를 사용하여 별칭을 지정하면 위의 방법과 같이 사용하지 않아도 된다.
2차원 배열
int list[2][3] = {{3, 6, 9}, {12, 15, 20}};
int *p[2], **X;
p[0] = &list[0][0];
p[1] = &list[1][0];
X = p = &p[0];
list[0][2] | 9 |
*(p[0]+1) | 6 |
*X + 2 | 2008 (2000 + 2*4) |
*(*X + 2) | 9 |
**X | 3 |
X[0][2] | 9 |