본문 바로가기
프로그래밍 언어/c(일반)

포인터(1) - 포인터 변수

by [Akashic Records] 개발의선지자 2024. 5. 2.

헤당 글은 개인 공부 정리를 위해 작성되었습니다.

 

포인터(변수)란? 

-> 메모리 주소 값을 저장하기 위한 변수

 

포인터 변수 선언 방법

 

1. 포인터 변수 선언

type * ptr;  -? 해당 type형 변수의 주소 값을 저장하는 포인터 변수 ptr 선언

포인터 변수의 선언 및 구분에 사용되는 int *, char *, double * 등을 가리켜 포인터 형이라고 한다. 

포인터형은 메모리 공간을 참조하는 기준, 포인터 형을 정의한 이유는 * 연산자를 통한 메모리 공간 접근 기준 마련하기 위해서이다.

 

2. 해당 포인터 변수에 주소 값 저장

&연산자 : 피연산자의 주소값 반환 연산자

아래 예제에서

"i_ptr는 int형 변수 num을 가리킨다."

"c_ptr는 char형 변수 ch를 가리킨다."

라고 표현한다.

void main(){
	int *i_ptr, char *c_ptr;
	int num = 1;
    char ch = 'a';
    i_ptr = #
    c_ptr = &ch;
}

 

잘못된 포인터 사용

*** 포인터 변수를 선언만 하고 초기화 하지 않으면 포인터 변수는 쓰레기 값으로 초기화 된다.

아래 잘못된 포인터 사용 예제들이다.

void main(void)
{
	//포인터 변수 초기화가 되지 않았다.
	int * ptr;
    *ptr = 200;
    
    //임의의 주소로 초기화
    int * ptr = 125;
    *ptr = 10;
}

 

포인터 변수 초기화

-> 널 포인터로 초기화 (널 포인터란? 아무 주소도 가리키지 않는다!)

void main(void)
{
	int * ptr1 = 0;
    int * ptr2 = NULL;
}

 

배열과 포인터와의 관계

배열명은 포인터> 값 변경이 불가한 상수 형태의 포인터

 

#include <stdio.h>

int main(void)
{
    int arr[3] = {0, 1, 2};
    printf("array name : %p\r\n", arr);
    printf("first : %p\r\n", &arr[0]);
    printf("second : %p\r\n", &arr[1]);
    printf("third: %p\r\n", &arr[2]);
    return 0;
}

 

위 예제를 보듯이 배열명은 배열의 시작 주소 값을 의미 , 그 형태는 값의 저장이 불가능한 상수

 

포인터를 배열의 이름처럼 사용 가능, 배열의 이름을 포인터처럼  사용 가능

 

#include <stdio.h>

int main(void)
{
    int arr[3] = {10, 20, 30};
    
    int * ptr = &arr[0]; // int * ptr = arr과 동일
    printf("%d %d \n", ptr[0], arr[0]);
    printf("%d %d \n", ptr[1], arr[1]);
    printf("%d %d \n", ptr[2], arr[2]);
    printf("%d %d \n", *ptr , *arr); //   printf("%d %d \n", ptr[0], arr[0]) 동일
    return 0;
}

 

포인터 연산

포인터를 대상으로 증가 및 감소 연산도 가능

 

TYPE형 포인터를 대상으로 n의 크기만 값을 증가 및 감소 시 , n x sizeof(TYPE)의 크기만큼 주소 값이 증가 및 감소한다.

- int형 포인터를 대상으로 n 증가/감소 -> n * sizeof(int)의 크기만큼 증가/감소

- float형 포인터 대상를 대상으로 n 증가/감소 -> n * sizeof(double)의 크기만큼 증가/감소

 

아래는 포인터 연산 예제이다.

실행 결과 

10 20 30
10  20  30  20  10  

#include <stdio.h>

int main(void)
{
    int arr[3] = {10, 20, 30};
    int *ptr = arr;
    printf("%d %d %d\n", *ptr, *(ptr+1), *(ptr+2));
    printf("%d  ", *ptr); ptr++;
    printf("%d  ", *ptr); ptr++;
    printf("%d  ", *ptr); ptr--;
    printf("%d  ", *ptr); ptr--;
    printf("%d  ", *ptr);
    return 0;
}

 

-> array[i] == *(array+i);

 

 

'프로그래밍 언어 > c(일반)' 카테고리의 다른 글

포인터(2) - 포인터 배열 / 배열 포인터  (0) 2024.07.11
extern 구조체 또는 변수 사용법 및 예시  (0) 2024.05.08
static 정적 변수  (0) 2024.05.07
삼항 연산자  (0) 2024.05.06
연산자 정리  (0) 2024.05.02