-
[자료구조] 1-1. 포인터 Pointer (C/C++)50 shades of ZZ/C(++) 자료구조 마스터 2023. 9. 26. 22:33728x90728x90
pointer 포인터 (= pointer variable)
- 어떤 변수의 메모리 주소를 저장하는 변수
- pointer constant : 메모리 주소에 대응하는 값
- pointer가 NULL일 경우, 해당 pointer는 아무것도 가리키지 않음을 의미 (실제 값은 0)
- <data_type> x;
- x라는 이름의 memory storage : storage 크기는 <data_type>에 따름
- (위치 : &x)
- <data_type> *p;
- type이 <data_type>인 memory storage의 주소를 저장하는 storage의 이름 (= pointer variable)
int main(){ int x = 9, *p; p = &x; } // <int> storage의 크기는 컴퓨터시스템에 따라 32 또는 64 bit
pointer 예시
- *(pointer) : pointer가 가리키는 variable (indirect operator)
- &(variable) : variable의 주소
int main(){ int x = 4, *p, *q; // x = 4, p = ?, q = ? p = &x; q = &x; // x = 4 <- *p = *q *p = 8; // x = 8 <- *p = 8 *&x = *p + *q; // x = 16 <- *p = *q = 8 *q = 3; // x = 3 <- *q = 3 x = *p * *q; // x = 9 <- *p = *q = 3 }
// pointer declaration int main(){ int *p; int* q; // pointer size : 4 bytes (32 bit system) // 8 bytes (64 bit system) int a = 2; int* r = &a; // r, s 모두 변수 a를 가리킴 int *s = &a; // *r = *s = 2 int* t, u; // t는 pointer, u는 integer int *v, *w; // v, w 모두 pointer }
// passing pointers void exchange_wrong(int x, int y){ // call by value int tmp = x; x = y; y = tmp; } // 함수 내 변수들은 해당 함수 안에서만 사용되고 제거 void exchange(int* x, int* y){ // call by reference int tmp = *x; *x = *y; *y = tmp; } void Pointer_Test(void){ int a = 7, b = 5; exchange_wrong(a, b); // a = 7, b = 5 exchange(&a, &b); // a = 5, b = 7 }
// returning pointers int* smaller_wrong(int *a, int *b){ int small = *a; // return된 후 사라짐 if (small > *b) small = *b; return &small; // small(로컬 변수)의 주소 return } int* smaller(int *a, int *b){ int* smallp = a; if (*smallp > *b) smallp = b; return smallp; // pointer 변수 return } int* dummy(int *p){ return p; } void Pointer_Test(void){ int x = 8, y = 5, z = 3, *sp, *zp; sp = smaller_wrong(&x, &y); zp = dummy(&z); // small 저장소의 값 삭제 됨 printf("%d\\n", *sp); // 5를 return하지 않을 수도 있음 sp = smaller(&x, &y); printf("%d\\n", *sp); // 5 return }
// pointer to pointer void Pointer_Test(void){ int a = 7; int* p = &a; int** q = &p; int*** r = &q; printf("%d %d %d\\n", *p. **q, ***r); } // r(&q) -> q(&p) -> p(&a) -> a = 7 // a = *p = **q = ***r = 7
type / level 호환에 따른 참조 오류 예시
void Pointer_Test(void){ char c; char* pc; int a, b; int* pa; int** ppa; pc = &c; // OK pa = &a; // OK ppa = &pa; // OK b = **ppa; // OK pc = &a; // Error: Different types pa = a; // Error: Different levels ppa = pa; // Error: Different levels b. = *ppa // Error: Different levels }
pointer 연산
- pointer를 기준으로 +, - 연산을 통해 배열의 원하는 위치에 값 읽고 쓰기 가능
void Pointer_Test(void){ int a[5] = {1, 2, 4, 6, 8}; int* q = a + 3; int n = 5, sum = 0, sump = 0; for(int i = 2; i < n; i++) sum += a[i]; for(int *p = a + 2; p < a + n; p++) sump += *p; printf("%d %d\\n", sum, sump); // sum = sump = 18 printf("%d %d\\n", *(q-2), *(q+1)); // 2 8 } /* a[0] = *(a+0) = *(q-3) = 1 // 주소: a or q-3 a[1] = *(a+1) = *(q-2) = 2 // 주소: a+1 or q-2 a[2] = *(a+2) = *(q-1) = 4 // 주소: a+2 or q-1 a[3] = *(a+3) = *(q+0) = 6 // 주소: a+3 or q a[4] = *(a+4) = *(q+1) = 8 // 주소: a+4 or q+1 */
- type 별 pointer 연산
void Pointer_Test(void){ char = a[3]; // 1byte 씩 int = b[3]; // 4byte 씩 (32bit system) double = c[3]; // 8byte 씩 }
2023.09.26 - [50 shades of ZZ/C(++) 자료구조 마스터] - [자료구조] C/C++ 자료구조 마스터(?)를 위한 요점 정리
728x90728x90'50 shades of ZZ > C(++) 자료구조 마스터' 카테고리의 다른 글
[자료구조] 1-3. 알고리즘 예시 & 재귀 함수 (C/C++) (0) 2023.09.27 [자료구조] 1-2. 동적 메모리 Dynamic memory (C/C++) (1) 2023.09.27 [자료구조] C/C++ 자료구조 마스터(?)를 위한 요점 정리 (0) 2023.09.26