C의 포인터: C 프로그래밍의 포인터란 무엇입니까? 유형
⚡ 스마트 요약
C 언어에서 포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터를 사용하면 동적 메모리 할당, 효율적인 배열 및 문자열 처리, 그리고 주소 참조 및 역참조 연산자를 사용하여 값을 읽거나 수정하는 복잡한 데이터 구조를 구현할 수 있습니다.

C 언어에서 포인터란 무엇인가요?
A 포인터 C 언어에서 포인터는 다른 변수의 주소를 저장하는 변수입니다. 포인터는 다른 포인터나 함수를 가리킬 수도 있습니다. 포인터 값을 증가시키거나 감소시켜 다음 또는 이전 메모리 위치를 가리키도록 할 수 있습니다. 포인터의 목적은 메모리 공간을 절약하고 실행 속도를 높이는 것입니다.
C에서 포인터를 사용하는 방법
int형 변수 v를 선언하면 v는 값을 저장합니다. 각 변수는 값 외에도 메모리상의 위치, 즉 변수를 저장하는 주소를 가지고 있습니다. 변수 주소는 변수 이름 앞에 앰퍼샌드(&)를 붙여서 얻을 수 있습니다. 변수의 주소를 출력하면 실행할 때마다 달라질 수 있는 임의의 숫자처럼 보일 수 있습니다.
포인터는 값을 저장하는 대신 변수의 주소를 저장합니다. 예를 들면 다음과 같습니다.
int *y = &v;
| 변하기 쉬운 | 바늘 |
|---|---|
| A 가치 에 저장 이름 저장소/메모리 주소. | A 변수 그 포인트 저장/메모리 주소 다른 변하기 쉬운. |
포인터 선언
변수와 마찬가지로 포인터도 C 프로그래밍 포인터는 사용하기 전에 반드시 선언해야 합니다. 포인터 선언의 형식은 다음과 같습니다.
data_type *pointer_variable_name;
여기 데이터 형식 `base`는 포인터의 기본 형식을 나타내며, 포인터가 가리키는 변수의 형식을 지정합니다. 별표(*)는 곱셈에 사용되는 것과 같은 기호로, 포인터를 선언하는 간접 연산자입니다. 유효한 포인터 선언의 예는 다음과 같습니다.
int *ptr_thing; /* pointer to an integer */ int *ptr1, thing; /* ptr1 points to an int; thing is an int */ double *ptr2; /* pointer to a double */ float *ptr3; /* pointer to a float */ char *ch1; /* pointer to a character */
포인터를 초기화합니다
포인터를 선언한 후에는 변수 주소로 초기화합니다. 초기화되지 않은 포인터를 사용하면 예측할 수 없는 결과가 발생하고 심각한 문제가 초래될 수 있습니다. 변수의 주소를 얻으려면 변수 이름 앞에 앰퍼샌드(&) 연산자를 사용합니다.
pointer = &variable;
포인터를 설명하는 간단한 프로그램은 다음과 같습니다.
#include <stdio.h> int main() { int a = 10; // variable declaration int *p; // pointer variable declaration p = &a; // store address of a in pointer p printf("Address stored in p is: %x\n", p); // access the address printf("Value stored in p is: %d\n", *p); // access the value return 0; }
출력:
Address stored in p is: 60ff08 Value stored in p is: 10
| Opera바위 산 | 의미 |
|---|---|
| * | 포인터를 선언하고, 참조된 변수의 값을 반환하는(역참조) 두 가지 목적을 수행합니다. |
| & | 이 함수는 변수의 주소를 반환하는 단 하나의 목적을 가지고 있습니다. |
C의 포인터 유형
널 포인터
포인터를 선언할 때 NULL 값을 할당하여 널 포인터를 생성합니다. 이는 포인터에 아직 주소가 할당되지 않았을 때 유용합니다. 널 포인터는 항상 0의 값을 가집니다.
#include <stdio.h> int main() { int *p = NULL; // null pointer printf("The value inside variable p is: %x", p); return 0; }
공허 포인터
void 포인터는 제네릭 포인터라고도 하며, 표준 데이터 형식이 없습니다. void 키워드를 사용하여 생성할 수 있으며, 어떤 변수의 주소든 저장할 수 있습니다.
#include <stdio.h> int main() { void *p = NULL; // void pointer printf("The size of pointer is: %d\n", sizeof(p)); return 0; }
와일드 포인터
포인터가 초기화되지 않은 경우 이를 와일드 포인터라고 합니다. 이러한 포인터는 알 수 없는 메모리 위치를 가리킬 수 있으므로 비효율적이며, 이로 인해 문제가 발생하거나 프로그램이 충돌할 수 있습니다. 와일드 포인터를 사용할 때는 항상 주의해야 합니다.
#include <stdio.h> int main() { int *p; // wild pointer printf("%d", *p); return 0; }
C 언어에서 사용되는 다른 포인터 유형으로는 댕글링 포인터, 복소수 포인터, 니어 포인터, 파 포인터, 그리고 휴즈 포인터가 있습니다.
직접 및 간접 액세스 포인터
C 언어에서는 변수의 내용에 접근하고 조작하는 두 가지 동등한 방법이 있습니다. 직접 접근은 변수 이름을 직접 사용하는 방식이고, 간접 접근은 변수를 가리키는 포인터를 사용하는 방식입니다.
#include <stdio.h> int var = 1; /* declare and initialize an int variable */ int *ptr; /* declare a pointer to int */ int main(void) { ptr = &var; /* point ptr to var */ printf("\nDirect access, var = %d", var); printf("\nIndirect access, var = %d", *ptr); *ptr = 48; /* change var through the pointer */ printf("\nIndirect access, var = %d", *ptr); return 0; }
C의 포인터 산술
포인터를 사용할 때는 다음 우선순위 규칙을 준수해야 합니다. 연산자 *와 &는 단항 연산자(부정 !, 증가 ++, 감소 –)와 동일한 우선순위를 가집니다. 동일한 표현식 내에서 단항 연산자 *, &, !, ++, —는 오른쪽에서 왼쪽으로 평가됩니다. 포인터 P가 변수 X를 가리키는 경우, X에 값을 쓸 수 있는 모든 곳에서 *P를 사용할 수 있습니다. 다음 표현식들은 서로 동일합니다.
| 표현 | 동등한 표현 |
|---|---|
| Y = *P + 1 | Y = X + 1 |
| *P = *P + 10 | X = X + 10 |
| *P += 2 | X += 2 |
| ++*피 | ++X |
| (*피)++ | 엑스++ |
마지막 경우에는 괄호가 필요합니다. 단항 연산자 *와 ++는 오른쪽에서 왼쪽으로 평가되기 때문에 괄호가 없으면 포인터 P가 증가하고 포인터가 가리키는 객체는 증가하지 않습니다. 포인터에 사용할 수 있는 산술 연산은 대입, 증가 및 감소, 덧셈 또는 뺄셈입니다.trac정수 오프셋을 지정하면 포인터가 해당 요소 수만큼 이동합니다(각 단계는 기본 유형의 바이트 크기와 같습니다).
C 언어의 포인터와 배열 (예제 포함)
전통적으로 배열 요소에 접근할 때는 인덱스를 사용했지만, 포인터를 사용하면 훨씬 쉽게 접근할 수 있습니다. 배열 이름을 포인터로 설정하면 첫 번째 요소를 가리킵니다.
#include <stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; // array initialization int *p; // pointer declaration p = a; // p points to the first element; same as &a[0] for (int i = 0; i < 5; i++) { printf("%d\n", *p); // print element p++; // move to the next element } return 0; }
포인터에 숫자를 더하면 그 숫자만큼 메모리 위치를 앞으로 이동합니다. 예를 들어 p가 메모리 위치 0을 가리키고 있다면, p + 1을 더하면 포인터는 메모리 위치 1을 가리키게 됩니다.
예제가 포함된 C 포인터 및 문자열
문자열은 '\0'이라는 널 문자로 끝나는 char 객체의 배열입니다. 포인터를 사용하여 문자열을 조작할 수 있습니다.
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello Guru99!"; char *p; p = str; printf("First character is: %c\n", *p); p = p + 1; printf("Next character is: %c\n", *p); p = str; // reset the pointer for (int i = 0; i < strlen(str); i++) { printf("%c\n", *p); p++; } return 0; }
문자열을 다루는 또 다른 방법은 포인터 배열을 사용하는 것입니다.
#include <stdio.h> int main() { char *materials[] = {"iron", "copper", "gold"}; for (int i = 0; i < 3; i++) printf("%s\n", materials[i]); return 0; }
C에서 포인터의 장점
- 포인터는 메모리 위치에 직접 접근하는 데 유용합니다.
- 배열의 요소에 효율적으로 접근하는 방법을 제공합니다.
- 이것들은 동적 메모리 할당 및 할당 해제에 사용됩니다.
- 이러한 라이브러리는 연결 리스트, 그래프, 트리와 같은 복잡한 데이터 구조를 구성하는 데 사용됩니다.
C 포인터의 단점
- 포인터는 이해하기가 약간 복잡합니다.
- 이로 인해 세그멘테이션 오류나 의도하지 않은 메모리 위치에 대한 접근과 같은 오류가 발생할 수 있습니다.
- 포인터에 잘못된 값을 입력하면 메모리 손상이 발생할 수 있습니다.
- 포인터는 메모리가 해제되지 않을 경우 메모리 누수의 원인이 되기도 합니다.
- 포인터를 다루는 것은 프로그래머의 책임입니다.
