반도체, 임베디드 Study/C

C - 포인터

잇(IT) 2024. 5. 13. 14:25
728x90

포인터 변수란 메모리의 주소 값을 저장하기 위한 변수다.

 

포인터는 '변수 형태의 포인터' '상수 형태의 포인터'를 어우르는 표현이다.

 

 

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는 다른 위치를 가리킬 수 있다.

 

상수 형태의 문자열은 고정된 값을 가지고 있고, 이 값은 프로그램이 실행되는 동안 변경되지 않는다.

변수 형태의 문자열은 프로그램 실행 중에 변경될 수 있는 값을 의미한다.

 

 

728x90