C - 포인터
2022. 3. 6. 18:35ㆍC
포인터란 ?
자료형 *포인터변수명 = &변수;
메모리의 구조
- 변수는 메모리에 저장된다.
- 메모리는 바이트 단위로 액세스 된다.
첫번째 바이트의 주소는 0, 두번째 바이트의 주소는 1 ....
포인터는 변수 값의 주소를 가리킨다.
컴퓨터가 변수를 기억하기 위해선 메모리 공간이 필요한데, 이때 포인터는 이 메모리 공간의 주소를 가리킴
간접 참조 연산자 * : 포인터가 가리키는 값을 가져오는 연산자
int i = 10;
int *p=&i;
printf("%d\n", *p);
*p = 20;
printf("%d\n", *p);
출력 결과
10
20
위 예제를 보면 포인터가 가리키는 주소안의 값이 출력이 되는 것을 확인할 수 있고,
int a = 10;
int *ptr = &a;
printf("ptr의 값 : %p\n", ptr);
printf("ptr이 가리키는 주소 안의 값 : %d",*ptr);
return 0;
출력 결과
ptr의 값 : 0x3057389f8
ptr이 가리키는 주소 안의 값 : 10
변수앞에 *을 붙여주면 주소안의 값이 나온다.
포인터 사용 예제
int a = 10;
int *ptr = &a;
printf("a의 값 : %d\n", a);
printf("a의 주소값 : %p\n", &a);
printf("ptr의 값 : %d\n", *ptr);
printf("ptr의 주소값 : %p\n\n", ptr);
*ptr = 20;
printf("a의 값 : %d\n", a);
printf("a의 주소값 : %p\n", &a);
printf("ptr의 값 : %d\n", *ptr);
printf("ptr의 주소값 : %p\n\n", ptr);
출력 결과
a의 값 : 10
a의 주소값 : 0x30d20f9fc
ptr의 값 : 10
ptr의 주소값 : 0x30d20f9fc
a의 값 : 20
a의 주소값 : 0x30d20f9fc
ptr의 값 : 20
ptr의 주소값 : 0x30d20f9fc
위 코드를 보면 주소값을 복사해오기 때문에 주소 자체에 접근해서 값을 바꾸면 원본 값까지 변경 되는 것을 확인할 수 있다.
*주의 사항
1.포인터는 가급적 선언과 초기화를 같이 해주는 것이 좋다
//나쁜 예시
int a = 10;
int *ptr;
*ptr = 20;
//좋은 예시
int a = 10;
int *ptr = &a;
*ptr = 100;
2.포인터 선언시 초기화 안하려면, NULL로 초기화 !!
int a = 10;
int *ptr = NULL;
ptr = &a;
3.포인터의 타입과 변수의 타입은 일치하여야 한다. (형변환을 이용해 처리할 순 있긴하다)
int i;
double *pd;
pd = (double*)&i;
형변환시 큰 자료형 -> 작은 자료형으로 가능은 하나 반대의 경우는 불가능
두 변수의 값을 서로 변환하는 포인터 함수
void swap(int *x, int *y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int main() {
int x = 1;
int y = 2;
swap(&x,&y);
printf("x= %d \ny= %d\n", x, y);
return 0;
}
출력 결과
x= 2
y= 1
포인터를 이용해 i값을 바꿔주는 프로그램
int i = 10;
int *p;
p = &i;
printf("i = %d\n", i );
*p = 20;
printf("i = %d\n", i );
return 0;
출력 결과
i = 10
i = 20
*포인터 연산시 증가 연산의 경우 증가되는 값은 포인터가 가리키는 객체의 크기이다.
포인터 타입 | ++연산 후 증가되는 값 |
char | 1 |
short | 2 |
int | 4 |
float | 4 |
double | 8 |
'C' 카테고리의 다른 글
C - getchar() 함수와 gets()함수 (0) | 2022.03.07 |
---|---|
C - 배열 (0) | 2022.03.06 |
C - 반복문 예제 (0) | 2022.02.25 |
C - 반복문 (0) | 2022.02.20 |
C - 조건문 (0) | 2022.02.20 |