산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C의 포인터:C 프로그래밍의 포인터란 무엇입니까? 유형

C에서 포인터란 무엇입니까?

포인터 C에서 는 다른 변수의 주소를 저장하는 변수입니다. 포인터는 다른 포인터 함수를 참조하는 데 사용할 수도 있습니다. 포인터는 증가/감소할 수 있습니다. 즉, 다음/이전 메모리 위치를 가리킵니다. 포인터의 목적은 메모리 공간을 절약하고 실행 시간을 단축하는 것입니다.

C에서 포인터를 사용하는 방법

int 유형의 변수 v를 선언하면 v는 실제로 값을 저장합니다.

v는 이제 0과 같습니다.

그러나 값과 별도로 각 변수에는 주소도 있습니다(또는 간단히 말해서 메모리에 있는 위치). 주소는 변수 이름 앞에 앰퍼샌드(&)를 넣어 검색할 수 있습니다.

변수의 주소를 화면에 출력하면 완전히 난수처럼 보일 것입니다(게다가 실행할 때마다 다를 수 있음).

C 예제에서 포인터를 사용하여 실제로 시도해 보겠습니다.

이 프로그램의 출력은 -480613588입니다.

이제 포인터가 무엇입니까? 값을 저장하는 대신 포인터는 변수의 주소를 저장합니다.

포인터 변수

정수 *y =&v;

VARIABLEPOINTERA named에 저장됨 스토리지/메모리 주소A 변수 가리키는 다른의 저장/메모리 주소 변수

포인터 선언

변수와 마찬가지로 C 프로그래밍의 포인터는 프로그램에서 사용되기 전에 선언되어야 합니다. 포인터는 C의 명명 규칙을 준수하는 한 원하는 이름을 지정할 수 있습니다. 포인터 선언의 형식은 다음과 같습니다.

data_type * pointer_variable_name;

여기,

이 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
연산자 의미 *2가지 용도

  1. 포인터 선언
  2. 참조된 변수의 값을 반환
1가지 용도로만 사용(&S)

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

보이드 포인터

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의 포인터 연산

포인터 작업은 다음 그림에 요약되어 있습니다.

우선 작업(우선)

C 포인터로 작업할 때 다음 우선 순위 규칙을 준수해야 합니다.

  • 연산자 * 및 &는 단항 연산자와 우선 순위가 동일합니다(부정!, 증가++, 감소–).
  • 같은 표현식에서 단항 연산자 *, &,!, ++, –는 오른쪽에서 왼쪽으로 평가됩니다.

P 포인터가 X 변수를 가리키면 X를 쓸 수 있는 모든 곳에서 * P를 사용할 수 있습니다.

다음 표현식은 동일합니다.

정수 X =10

정수 *P =&Y;

위 코드의 경우 아래 표현식은 true입니다.

식 등가 식Y=*P+1

*P=*P+10

*P+=2

++*P

(*P)++

Y=X+1

X=X+10

X+=2

+X

X++

후자의 경우 괄호가 필요합니다. 단항 연산자 * 및 ++가 오른쪽에서 왼쪽으로 평가되기 때문에 괄호 없이는 P가 가리키는 개체가 아니라 포인터 P가 증가합니다.

아래 표는 C 포인터를 다룰 때 사용할 수 있는 산술 및 기본 연산을 보여줍니다.

작업 설명 할당int *P1,*P2
P1=P2;
P1과 P2는 동일한 정수를 가리킵니다. variableIncrementation 및 decrementationInt *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는 현재 1을 더한 후 위치 0을 가리키고 있으므로 값은 1이 되고 포인터는 메모리 위치 1을 가리킵니다.

C 포인터와 예가 있는 문자열

문자열은 null 문자 '\ 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 포인터를 사용할 수 있습니다.

C 언어

  1. C# 변수 및 (기본) 데이터 형식
  2. C 프로그래밍의 사용자 정의 함수 유형
  3. C 포인터
  4. 예제가 있는 C++ 포인터
  5. 3D 프린팅이란 무엇입니까? 작동 원리 | 종류 | 애플리케이션
  6. 자바 - 변수 유형
  7. C - 포인터
  8. C++ 변수 유형
  9. Python - 변수 유형
  10. 용접이란?- 정의 | 용접의 종류