One Step Two Step
[C언어 기초] C언어의 꽃, 포인터(Pointer) 완벽 이해하기 본문
반응형
- 포인터 (Pointer)
- 메모리의 주소를 저장하는 변수
- 포인터 선언 ☞ 자료형 * 포인터이름;
- 초기화 필수
char c = 'A'; // 문자형 변수 float f = 36.5; // 실수형 변수 double d = 3.141592;// 실수형 변수 char *pc = &c; // 문자를 가리키는 포인터 float *pf = %f; // 실수를 가리키는 포인터 double *pd = %d; // 실수를 가리키는 포인터 - " * " 간접 참조 연산자
- 포인터가 가리키는 값을 가져오는 연산자
- " & " 주소 연산자
- 변수의 메모리 주소값을 알아내는 연산자
int num = 10; // 일반 변수 int *p; // 포인터 변수 선언 p = # // num의 주소를 p에 저장 printf("num의 값: %d\n", num); printf("num의 주소: %p\n", &num); printf("포인터 p가 가진 주소: %p\n", p); printf("포인터 p가 가리키는 곳의 값: %d\n", *p); // '간접 참조' /* num의 값: 10 num의 주소: 0000008990AFFAF4 포인터 p가 가진 주소: 0000008990AFFAF4 포인터 p가 가리키는 곳의 값: 10 */
- 변수의 메모리 주소값을 알아내는 연산자
- 포인터 연산
-
증가(++), 감소(--), 덧셈(+), 뺄셈(-)
-
증가 연산의 경우 증가되는 포인터가 가리키는 객체의 크기

#include <stdio.h> int main(void) { char *pc; int *pi; double *pd; pc = (char *)10000; pi = (int *)10000; pd = (double *)10000; printf("증가 전 pc = %d, pi = %d, pd = %d\n", pc, pi, pd); pc++; pi++; pd++; printf("증가 후 pc = %d, pi = %d, pd = %d\n", pc, pi, pd); printf("pc+2 = %d, pi+2 = %d, pd+2 = %d\n",pc+2,pi+2,pd+2); return 0; } // 증가 전 pc = 10000, pi = 10000, pd = 10000 // 증가 후 pc = 10001, pi = 10004, pd = 10008 // pc+2 = 10003, pi+2 = 10012, pd+2 = 10024 - * 연산자와 증감 연산자
- *p++; → *(p++), p를 먼저 사용(역참조)한 뒤, 포인터 p를 1 증가 (주소값 증가)
- (*p)++; → p가 가리키는 위치의 값을 증가
- *++p; → *(++p), 포인터를 먼저 증가시킨 뒤, 그 위치를 역참조 (주소값 증가)
- ++*p; → ++(*p), 현재 가리키는 값을 먼저 증가시키고 그 값을 사용
-
- 포인터와 배열
- 배열 이름 == 포인터, 포인터는 배열처럼 사용 O

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int arr[3] = { 10, 20, 30 };
int* p;
p = arr;
printf("배열의 이름 arr의 값: %p\n", arr);
printf("arr[0]=%d arr[1]=%d arr[2]=%d \n", arr[0], arr[1], arr[2]);
printf("포인터 이용\n");
printf("배열의 이름 arr의 값: %p\n", p);
printf("p[0]=%d p[1]=%d p[2]=%d \n", p[0],p[1], p[2]);
return 0;
}
/*
배열의 이름 arr의 값: 000000574D7AF728
arr[0]=10 arr[1]=20 arr[2]=30
포인터 이용
배열의 이름 arr의 값: 000000574D7AF728
p[0]=10 p[1]=20 p[2]=30
*/
- 인수 전달 방법
- 함수 호출 시 인수 전달 방법
- 값에 의한 호출 (call by value)
- 함수로 복사본 전달
- 기본적인 방법
- 참조에 의한 호출 (call by reference)
- 함수로 원본 전달
- 포인터
- 값에 의한 호출 (call by value)
- 함수 호출 시 인수 전달 방법
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void swap_value(int x, int y);
void swap_reference(int *px, int *py);
int main(void) {
printf("Call by value\n");
int a = 100, b = 200;
printf("a=%d b=%d\n", a, b);
swap_value(a, b);
printf("a=%d b=%d\n\n", a, b);
printf("Call by reference\n");
printf("a=%d b=%d\n", a, b);
swap_reference(&a, &b);
printf("a=%d b=%d\n\n", a, b);
return 0;
}
void swap_value(int x, int y) {
int tmp;
printf("x=%d y=%d\n", x, y);
tmp = x;
x = y;
y = tmp;
printf("x=%d y=%d\n", x, y);
}
void swap_reference(int* px, int* py) {
int tmp;
printf("x=%d y=%d\n", *px, *py);
tmp = *px;
*px = *py;
*py = tmp;
printf("x=%d y=%d\n", *px, *py);
}
/*
Call by value
a=100 b=200
x=100 y=200
x=200 y=100
a=100 b=200
Call by reference
a=100 b=200
x=100 y=200
x=200 y=100
a=200 b=100
*/
반응형
'복습 > C언어' 카테고리의 다른 글
| [C언어 기초] C에는 '문자열'이라는 이름의 자료형이 없다? (0) | 2026.03.05 |
|---|---|
| [C언어 기초] 데이터의 묶음! 배열과 다차원 배열, 그리고 정렬 (0) | 2026.03.03 |
| [C언어 기초] 변수의 생존 범위와 함수 스스로를 부르는 '순환 호출' (1) | 2026.03.02 |
| [C언어 기초] 프로그램을 구성하는 핵심 부품, '함수(Function)' (1) | 2026.03.01 |
| [C언어 기초] 반복문 "while" / "do...while" / "for" (0) | 2026.02.28 |