자격증/정보처리기사
C 포인터
ewok
2023. 4. 6. 12:28
포인터 변수
주소참조 : 메모리 영역에는 주소가 부여되어 있다.
포인터 변수 : (포인터를 사용하기 위해) 포인터 값(주소)을 다룰 수 있는 변수
주소를 다루는 방법
- & - 주소 연산자
- * - 포인터 연산자, 간접 연산자
포인터
- 특정한 데이터가 저장된 주소값(시작 주소)을 저장하는 변수
- 하나의 주소값은 1바이트 크기의 메모릭 공간을 표현함
포인터 변수 선언문
형식 : 자료형* 포인터변수명;
{
int *p1;
int* p1;
}
위 두 표현은 같은 표현으로 포인터형이다.
포인터변수 선언과 대입
기본자료형 변수
int num;
num = 10;
int형에는 정수인 상수가 들어간다.
포인터자료형 변수
int* p;
p = #
int*형에는 정수변수의 주소가 들어간다. &num에서 &은 주소 연산자이다. 따라서 &num은 num변수의 주소를 의미한다. 그래서 p에는 num의 주소가 들어간다.
이를 통해 p는 num의 주소를 가리킬 수 있게 된다. 10에 접근하는 두 가지 방법이 생긴 것이다. num이라는 변수명을 통한 접근과 p에 담긴 주소를 통한 접근이다.
포인터 변수와 연산자
&(주소연산자)
모든 변수에 대한 주소값을 구하는 연산자
*(포인터연산자, 간접연산자)
포인터 변수의 자료(내용)를 구하는 연산자
선언문인 int* p; 에 있는 *는 연산자가 아니다.
#include <stdio.h>
void main()
{
int num;
int* p1;
num = 100;
p1 = # // num의 주소를 p1에 대입
printf("일반변수 접근 : %d\n", num); // 100
printf("포인터변수 접근 : %d\n", *p1); // 100
}
#include <stdio.h>
void main()
{
float num;
float* p1;
num = 3.14;
p1 = #
printf("일반변수 접근 : %f\n", num); // 3.14
printf("포인터변수 접근 : %f\n", *p1); // 3.14
}
포인터 변수와 배열
#include <stdio.h>
void main()
{
int i;
int A[] = {10,20,30,40,50};
int* p;
p = A; // p = &A[0];
for (i = 0; i < 5; i++)
{
printf("%5d", *(p+i)); // printf("%5d", A[i]);
}
}
포인터 변수와 연산
#include <stdio.h>
void main()
{
int NUM = 98;
int* ptr;
ptr = &NUM;
--------------------- 그림1
NUM = NUM + 1; // NUM = 98 + 1;
printf("%d\n, NUM"); // 99
--------------------- 그림2
*ptr = *ptr + 1; // *ptr = 99 + 1; / (*ptr)++;
printf("%d\n", *ptr); // 100
--------------------- 그림3
}

ptr은 200번지를 의미하며, *ptr은 200번지의 내용을 의미한다.