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

C 포인터

C 포인터

이 자습서에서는 포인터에 대해 배웁니다. 포인터가 무엇인지, 어떻게 사용하는지, 예제를 통해 포인터로 작업할 때 직면할 수 있는 일반적인 실수.

포인터는 C 및 C++ 프로그래밍의 강력한 기능입니다. 포인터를 배우기 전에 C 프로그래밍의 주소에 대해 알아보겠습니다.

<시간>

C 주소

변수 var가 있는 경우 프로그램에서 &var 메모리에 있는 주소를 알려줍니다.

scanf()을(를) 사용하는 동안 주소를 여러 번 사용했습니다. 기능.

scanf("%d", &var);

여기서 사용자가 입력한 값은 var 주소에 저장됩니다. 변하기 쉬운. 실제 예를 들어 보겠습니다.

#include <stdio.h>
int main()
{
  int var = 5;
  printf("var: %d\n", var);

  // Notice the use of & before var
  printf("address of var: %p", &var);  
  return 0;
}

출력

var: 5 
address of var: 2686778

참고: 위의 코드를 실행하면 아마 다른 주소를 받게 될 것입니다.

<시간>

C 포인터

포인터(포인터 변수)는 값이 아닌 주소를 저장하는 데 사용되는 특수 변수입니다.

포인터 구문

다음은 포인터를 선언하는 방법입니다.

int* p;

여기에서 포인터 p를 선언했습니다. int 중 유형.

이러한 방식으로 포인터를 선언할 수도 있습니다.

int *p1;
int * p2;
<시간>

포인터를 선언하는 또 다른 예를 들어보겠습니다.

int* p1, p2;

여기에서 p1 포인터를 선언했습니다. 및 일반 변수 p2 .

<시간>

포인터에 주소 할당

예를 들어보겠습니다.

int* pc, c;
c = 5;
pc = &c;

여기서 5는 c에 할당됩니다. 변하기 쉬운. 그리고 c의 주소는 pc에 할당됩니다. 포인터.

<시간>

포인터가 가리키는 값 가져오기

포인터가 가리키는 값을 얻으려면 *을 사용합니다. 운영자. 예:

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc);   // Output: 5

여기서 c의 주소는 pc에 할당됩니다. 바늘. 해당 주소에 저장된 값을 가져오기 위해 *pc를 사용했습니다. .

참고: 위의 예에서 pc *pc이 아닌 포인터입니다. . *pc = &c과 같은 작업은 할 수 없고 해서는 안 됩니다.;

그건 그렇고, * 역참조 연산자(포인터로 작업할 때)라고 합니다. 포인터에서 작동하고 해당 포인터에 저장된 값을 제공합니다.

<시간>

포인터가 가리키는 값 변경

예를 들어보겠습니다.

int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c);    // Output: 1
printf("%d", *pc);  // Ouptut: 1

c의 주소를 할당했습니다. pc에 포인터.

그런 다음 c의 값을 변경했습니다. 1. pc 이후 및 c의 주소 동일합니다. *pc 1을 제공합니다.

다른 예를 들어보겠습니다.

int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc);  // Ouptut: 1
printf("%d", c);    // Output: 1

c의 주소를 할당했습니다. pc에 포인터.

그런 다음 *pc을 변경했습니다. *pc = 1;를 사용하여 1로 . pc 이후 및 c의 주소 동일합니다. c 1과 같습니다.

예를 하나 더 들어보겠습니다.

int* pc, c, d;
c = 5;
d = -15;

pc = &c; printf("%d", *pc); // Output: 5
pc = &d; printf("%d", *pc); // Ouptut: -15

처음에 c의 주소는 pc에 할당됩니다. pc = &c;를 사용하는 포인터 . c 이후 5, *pc 5를 줍니다.

그런 다음 d의 주소는 pc에 할당됩니다. pc = &d;을 사용하는 포인터 . d 이후 -15, *pc -15를 줍니다.

<시간>

예:포인터 작업

실제 예를 들어보겠습니다.

#include <stdio.h>
int main()
{
   int* pc, c;
   
   c = 22;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c);  // 22
   
   pc = &c;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 22
   
   c = 11;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 11
   
   *pc = 2;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c); // 2
   return 0;
}

출력

Address of c: 2686784
Value of c: 22

Address of pointer pc: 2686784
Content of pointer pc: 22

Address of pointer pc: 2686784
Content of pointer pc: 11

Address of c: 2686784
Value of c: 2
<시간>

프로그램 설명

  1. int* pc, c;

    여기서 포인터 pc 및 일반 변수 c , 둘 다 int 유형 , 생성됩니다.
    pc 이후 및 c 초기에 초기화되지 않음, 포인터 pc 주소가 없거나 임의의 주소를 가리킵니다. 그리고 변수 c 주소가 있지만 임의의 가비지 값을 포함합니다.
  2. c = 22;

    이것은 c 변수에 22를 할당합니다. . 즉, 변수 c의 메모리 위치에 22가 저장됩니다. .
  3. pc = &c;

    이것은 변수 c의 주소를 할당합니다. 포인터 pc로 .
  4. c = 11;

    이것은 변수 c에 11을 할당합니다. .
  5. *pc = 2;

    이것은 포인터 pc가 가리키는 메모리 위치의 값을 변경합니다. 2.
<시간>

포인터 작업 시 일반적인 실수

포인터 pc를 원한다고 가정해 보겠습니다. c의 주소를 가리키기 위해 . 그럼

int c, *pc;

// pc is address but c is not
pc = c;  // Error

// &c is address but *pc is not
*pc = &c;  // Error

// both &c and pc are addresses
pc = &c;  // Not an error

// both c and *pc values 
*pc = c;  // Not an error

다음은 포인터 구문 초보자가 종종 혼동하는 예입니다.

#include <stdio.h>
int main() {
   int c = 5;
   int *p = &c;

   printf("%d", *p);  // 5
   return 0; 
}

int *p = &c;를 사용할 때 오류가 발생하지 않는 이유 ?

그 이유는

int *p = &c;

와 동일합니다.

int *p:
p = &c;

두 경우 모두 p 포인터를 생성합니다. (*p 아님 ) 및 &c 할당 그것에.

이러한 혼란을 피하기 위해 다음과 같은 구문을 사용할 수 있습니다.

int* p = &c;
<시간>

이제 포인터가 무엇인지 알았으니 다음 튜토리얼에서 포인터가 배열과 어떻게 관련되는지 배우게 될 것입니다.


C 언어

  1. C# Hello World - 첫 번째 C# 프로그램
  2. C# 키워드 및 식별자
  3. C# 변수 및 (기본) 데이터 형식
  4. C# 연산자
  5. C# 비트 및 비트 시프트 연산자
  6. C# 기본 입력 및 출력
  7. C# 식, 문 및 블록(예제 포함)
  8. C# 주석
  9. C 포인터
  10. 배열과 포인터의 관계