헤당 글은 개인 공부 정리를 위해 작성되었습니다.
포인터(변수)란?
-> 메모리 주소 값을 저장하기 위한 변수
포인터 변수 선언 방법
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 |