C의 포인터: C 프로그래밍의 포인터란 무엇입니까? 유형
C에서 포인터란 무엇인가?
The 포인터 C에서 는 다른 변수의 주소를 저장하는 변수입니다. 포인터는 다른 포인터 함수를 참조하는 데에도 사용될 수 있습니다. 포인터는 증가/감소할 수 있습니다. 즉, 다음/이전 메모리 위치를 가리킬 수 있습니다. 포인터의 목적은 메모리 공간을 절약하고 실행 시간을 단축하는 것입니다.
C에서 포인터를 사용하는 방법
int 유형의 변수 v를 선언하면 v는 실제로 값을 저장합니다.
v는 이제 XNUMX과 같습니다.
그러나 값 외에도 각 변수에는 주소(간단히 말하면 메모리 내 위치)도 있습니다. 변수 이름 앞에 앰퍼샌드(&)를 넣으면 주소를 검색할 수 있습니다.
변수의 주소를 화면에 출력하면 완전히 난수처럼 보일 것입니다(게다가 실행마다 다를 수도 있습니다).
C 예제의 포인터를 사용하여 실제로 시도해 보겠습니다.
이 프로그램의 출력은 -480613588입니다.
자, 포인터란 무엇일까요? 포인터는 값을 저장하는 대신 변수의 주소를 저장합니다.
포인터 변수
Int *y = &v;
변하기 쉬운 | 바늘 |
---|---|
A 가치 에 저장 이름 저장/메모리 주소 | A 변수 그 포인트 저장/메모리 주소 다른 변수 |
포인터 선언
변수와 마찬가지로 포인터도 C 프로그래밍 프로그램에서 사용하기 전에 선언해야 합니다. 포인터는 C의 명명 규칙을 따르는 한 원하는 대로 명명할 수 있습니다. 포인터 선언은 다음과 같은 형식을 갖습니다.
data_type * pointer_variable_name;
여기
- 데이터 형식 C의 변수 유형 중 포인터의 기본 유형이며 포인터가 가리키는 변수의 유형을 나타냅니다.
- 간접 연산자인 별표(*: 곱셈에 사용되는 별표와 동일)는 포인터를 선언합니다.
이 C 포인터 튜토리얼에서 유효한 포인터 선언을 살펴보겠습니다.
int *ptr_thing; /* pointer to an integer */ int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */ double *ptr2; /* pointer to a double */ float *ptr3; /* pointer to a float */ char *ch1 ; /* pointer to a character */ float *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */
포인터 초기화
포인터를 선언한 후, 변수 주소로 표준 변수처럼 초기화합니다. C 프로그래밍에서 포인터가 초기화되지 않고 프로그램에서 사용되는 경우, 결과는 예측할 수 없고 잠재적으로 재앙이 될 수 있습니다.
변수의 주소를 얻으려면, 주소가 필요한 변수의 이름 앞에 앰퍼샌드(&) 연산자를 사용합니다. 포인터 초기화는 다음 구문으로 수행됩니다.
포인터 구문
pointer = &variable;
포인터 그림을 위한 간단한 프로그램은 다음과 같습니다.
#include <stdio.h> int main() { int a=10; //variable declaration int *p; //pointer variable declaration p=&a; //store address of variable a in pointer p printf("Address stored in a variable p is:%x\n",p); //accessing the address printf("Value stored in a variable p is:%d\n",*p); //accessing the value return 0; }
출력:
Address stored in a variable p is:60ff08 Value stored in a variable p is:10
Opera바위 산 | 의미 |
---|---|
* | 2가지 목적을 제공합니다
|
& | 단 한 가지 목적으로만 사용됩니다.
|
C의 포인터 유형
다음은 다른 것입니다 C의 포인터 유형:
널 포인터
포인터 선언 중에 null 값을 할당하여 null 포인터를 만들 수 있습니다. 이 방법은 포인터에 할당된 주소가 없을 때 유용합니다. 널 포인터는 항상 값 0을 포함합니다.
다음 프로그램은 널 포인터의 사용을 보여줍니다.
#include <stdio.h> int main() { int *p = NULL; //null pointer printf(“The value inside variable p is:\n%x”,p); return 0; }
출력:
The value inside variable p is: 0
공허 포인터
In C 프로그래밍, void 포인터는 일반 포인터라고도 합니다. 표준 데이터 유형이 없습니다. void 포인터는 void 키워드를 사용하여 생성됩니다. 모든 변수의 주소를 저장하는 데 사용할 수 있습니다.
다음 프로그램은 void 포인터의 사용을 보여줍니다.
#include <stdio.h> int main() { void *p = NULL; //void pointer printf("The size of pointer is:%d\n",sizeof(p)); return 0; }
출력:
The size of pointer is:4
와일드 포인터
어떤 것으로도 초기화되지 않은 포인터를 와일드 포인터라고 합니다. 이러한 유형의 C 포인터는 프로그램에 문제를 일으킬 수 있고 프로그램 충돌로 이어질 수 있는 알 수 없는 메모리 위치를 가리킬 수 있기 때문에 효율적이지 않습니다. 와일드 포인터로 작업할 때는 항상 조심해야 합니다.
다음 프로그램은 와일드 포인터의 사용을 보여줍니다.
#include <stdio.h> int main() { int *p; //wild pointer printf("\n%d",*p); return 0; }
출력:
timeout: the monitored command dumped core sh: line 1: 95298 Segmentation fault timeout 10s main
'c'의 다른 유형의 포인터는 다음과 같습니다.
- 매달린 포인터
- 복합 포인터
- 근거리 포인터
- 원거리 포인터
- 거대한 포인터
직접 및 간접 액세스 포인터
C에는 변수 내용에 액세스하고 조작하는 두 가지 동일한 방법이 있습니다.
- 직접 접근: 변수 이름을 직접 사용합니다.
- 간접 접근: 변수에 대한 포인터를 사용합니다.
아래 프로그램의 도움으로 이것을 이해해 봅시다.
#include <stdio.h> /* Declare and initialize an int variable */ int var = 1; /* Declare a pointer to int */ int *ptr; int main( void ) { /* Initialize ptr to point to var */ ptr = &var; /* Access var directly and indirectly */ printf("\nDirect access, var = %d", var); printf("\nIndirect access, var = %d", *ptr); /* Display the address of var two ways */ printf("\n\nThe address of var = %d", &var); printf("\nThe address of var = %d\n", ptr); /*change the content of var through the pointer*/ *ptr=48; printf("\nIndirect access, var = %d", *ptr); return 0;}
오류 없이 프로그램을 컴파일한 후의 결과는 다음과 같습니다.
Direct access, var = 1 Indirect access, var = 1 The address of var = 4202496 The address of var = 4202496 Indirect access, var = 48
C의 포인터 산술
포인터 연산은 다음 그림과 같이 요약됩니다.
우선순위 연산(precedence)
C 포인터를 사용할 때는 다음과 같은 우선순위 규칙을 따라야 합니다.
- 연산자 * 및 &는 단항 연산자(부정!, 증가++, 감소–)와 동일한 우선순위를 갖습니다.
- 동일한 표현식에서 단항 연산자 *, &, !, ++, –는 오른쪽에서 왼쪽으로 평가됩니다.
P 포인터가 X 변수를 가리키는 경우 X를 쓸 수 있는 곳이면 어디든 *P를 사용할 수 있습니다.
다음 표현은 동일합니다.
int X =10 int *P = &Y; For the above code, below expressions are true
표현 | 동등한 표현 |
---|---|
Y=*P+1
*P=*P+10 *P+=2 ++*피 (*피)++ |
Y=X+1
엑스=엑스+10 X+=2 ++X 엑스++ |
후자의 경우, 괄호가 필요합니다. 단항 연산자 *와 ++는 오른쪽에서 왼쪽으로 평가되므로, 괄호가 없으면 포인터 P가 증가하고, P가 가리키는 객체는 증가하지 않습니다.
아래 표는 C 포인터를 다룰 때 사용할 수 있는 산술 및 기본 연산을 보여줍니다.
Opera기 | 설명 |
---|---|
할당 | 정수 *P1,*P2 P1=P2; P1과 P2는 동일한 정수 변수를 가리킵니다. |
증가 및 감소 | 정수 *P1; P1++;P1– ; |
오프셋 추가(상수) | 이를 통해 포인터는 테이블의 N개 요소를 이동할 수 있습니다. 포인터는 변수 유형의 바이트 수의 N배만큼 증가하거나 감소합니다. P1+5; |
C 포인터 및 배열과 예제
전통적으로 우리는 인덱스를 사용하여 배열 요소에 액세스하지만 포인터를 사용하면 이 방법을 제거할 수 있습니다. 포인터를 사용하면 각 배열 요소에 쉽게 액세스할 수 있습니다.
#include <stdio.h> int main() { int a[5]={1,2,3,4,5}; //array initialization int *p; //pointer declaration /*the ptr points to the first element of the array*/ p=a; /*We can also type simply ptr==&a[0] */ printf("Printing the array elements using pointer\n"); for(int i=0;i<5;i++) //loop for traversing array elements { printf("\n%x",*p); //printing array elements p++; //incrementing to the next element, you can also write p=p+1 } return 0; }
출력:
1 2 3 4 5
포인터에 특정 숫자를 더하면 포인터 위치가 덧셈 연산으로 얻은 값으로 이동합니다. p가 현재 메모리 위치 0을 가리키는 포인터라고 가정하고, 다음 덧셈 연산 p+1을 수행하면 다음과 같이 실행됩니다.
p는 현재 0을 더한 후 위치 1을 가리키고 있으므로 값은 1이 되고 따라서 포인터는 메모리 위치 1을 가리킬 것입니다.
예제가 포함된 C 포인터 및 문자열
문자열은 널 문자 '\ 0'으로 끝나는 char 객체의 배열입니다. 포인터를 사용하여 문자열을 조작할 수 있습니다. C 예제의 이 포인터는 이 섹션을 설명합니다.
#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); printf("Printing all the characters in a string\n"); p=str; //reset the pointer for(int i=0;i<strlen(str);i++) { printf("%c\n",*p); p++; } return 0; }
출력:
First character is:H Next character is:e Printing all the characters in a string H e l l o G u r u 9 9 !
문자열을 처리하는 또 다른 방법은 다음 프로그램과 같이 포인터 배열을 사용하는 것입니다.
#include <stdio.h> int main(){ char *materials[ ] = { "iron", "copper", "gold"}; printf("Please remember these materials :\n"); int i ; for (i = 0; i < 3; i++) { printf("%s\n", materials[ i ]);} return 0;}
출력:
Please remember these materials: iron copper gold
C에서 포인터의 장점
- 포인터는 메모리 위치에 액세스하는 데 유용합니다.
- 포인터는 배열 구조의 요소에 액세스하는 효율적인 방법을 제공합니다.
- 포인터는 동적 메모리 할당 및 할당 해제에 사용됩니다.
- 포인터는 연결 리스트, 그래프, 트리 등과 같은 복잡한 데이터 구조를 형성하는 데 사용됩니다.
C 포인터의 단점
- 포인터는 이해하기가 약간 복잡합니다.
- 포인터는 분할 오류와 같은 다양한 오류를 발생시키거나 전혀 필요하지 않은 메모리 위치에 액세스할 수 있습니다.
- 포인터에 잘못된 값을 제공하면 메모리 손상이 발생할 수 있습니다.
- 포인터는 또한 메모리 누수를 담당합니다.
- 포인터는 변수보다 상대적으로 느립니다.
- 프로그래머는 포인터를 사용하여 작업하는 것이 매우 어렵다는 것을 알게 됩니다. 그러므로 포인터를 조심스럽게 조작하는 것은 프로그래머의 책임입니다.
제품 개요
- 포인터는 데이터가 저장되는 메모리 위치일 뿐입니다.
- 포인터는 메모리 위치에 액세스하는 데 사용됩니다.
- 널 포인터, 와일드 포인터, 무효 포인터 및 기타 유형의 포인터와 같은 다양한 유형의 포인터가 있습니다.
- 포인터를 배열 및 문자열과 함께 사용하여 요소에 보다 효율적으로 액세스할 수 있습니다.
- 함수 포인터를 생성하여 함수를 동적으로 호출할 수 있습니다.
- 포인터에 대한 산술 연산을 수행할 수 있으며 이를 포인터 산술이라고 합니다.
- 포인터는 포인터 배열을 정의하는 경우 다른 함수를 쉽게 호출할 수 있도록 함수를 가리킬 수도 있습니다.
- 다양한 변수 데이터 유형을 처리하려는 경우 typecast void 포인터를 사용할 수 있습니다.