포인터 변수란 메모리의 주소 값을 저장하기 위한 변수다.
포인터는 '변수 형태의 포인터' '상수 형태의 포인터'를 어우르는 표현이다.
int main(void)
{
int num = 7;
int * pnum;
pnum = #
}
위 코드의 의미는 int형 변수 num에는 7의 값이 저장되어 있고, 포인터 pnum은 num 변수의 주소값이 저장되어 있다.
& 연산자의 피연산자는 변수이어야 하며, 상수는 피연산자가 될 수 없다.
int main(void)
{
int num1 = 5;
double * pnum1 = &num1;
double num2 = 5;
int * pnum2 = &num2;
}
위 코드는 자료형이 일치하지 않기 때문에 문제가 발생할 수 있다.
포인터가 가리키는 메모리를 참조하는 * 연산자
int main(void)
{
int num = 10;
int * pnum = #
*pnum = 20;
printf("%d", *pnum);
}
위 코드는 int 자료형 num에 10의 값을 넣었고, pnum은 num의 주소값을 가지고 있다. *을 사용하여 포인터 변수에 접근하게 되면 해당 메모리 공간에 접근하여 num 주소 공간에 있는 10의 값을 반환한다.
* 주의할 점
포인터 변수를 선언만하고 초기화하지 않으면, 포인터 변수는 쓰레기 값으로 초기화 된다.
만약 포인터 변수를 초기화 해야할 상황이 생긴다면 NULL 값으로 초기화 하는 것이 좋다.
배열과 포인터
배열의 이름은 포인터다. 단, 그 값을 바꿀 수 없는 '상수 형태의 포인터'이다.
int형 배열요소간 주소 값의 차이는 4바이트
double형 배열요소간 주소 값의 차이는 8바이트
즉, 해당 자료형의 크기만큼 배열요소간의 주소 값의 차이가 발생한다.
배열의 이름은 배열의 시작 주소 값을 의미하며, 그 형태는 값의 저장이 불가능한 상수이다.
배열의 이름은 포인터이고, 첫번째 요소의 주소값을 가르키게 된다.
#include <stdio.h>
int main(void)
{
int arr1[3] = {1, 2, 3};
double arr2[3] = {1.1, 2.2, 3.3};/
printf("%d %g \n", *arr1, *arr2);
*arr1 += 100;
*arr2 += 120.5;
printf("%d %g \n", arr1[0], arr2[0]);
return 0;
}
위 코드의 결과값으로 아래의 결과값이 나오게 된다.
1 1.1
101 121.6
상수 형태의 문자열을 가리키는 포인터
char str1[] = "My String";
char * str2 = "Your String";
str1[]은 그 자체로 문자열 전체를 저장하는 배열이고, str2는 메모리상에 자동으로 저장된 문자열 "Your String"의 첫 번째 문자를 단순히 가리키고만 있는 포인터 변수다.
배열이름 str1은 계속해서 문자 M이 저장된 위치를 가리키는 상태이어야 하지만 포인터 변수 str2는 다른 위치를 가리킬 수 있다.
상수 형태의 문자열은 고정된 값을 가지고 있고, 이 값은 프로그램이 실행되는 동안 변경되지 않는다.
변수 형태의 문자열은 프로그램 실행 중에 변경될 수 있는 값을 의미한다.
'Embedded > C, C#, Python' 카테고리의 다른 글
C# - WinForm 기본 화면 구성 (0) | 2024.06.10 |
---|---|
C# - 계산기 만들기 (Class, Stack 사용) (코드 설명 필요) (0) | 2024.05.19 |
C# 컬렉션, 제네릭, 널(null), LINQ (0) | 2024.04.29 |
C# - 문자열 / 예외 처리 (0) | 2024.04.22 |
C# - 코딩 연습 / 1. Lotto 제작 / 2. 가위바위보 게임 (0) | 2024.04.22 |