C 포인터


C 언어로 포인터를 배우는 것은 쉽고 재미있습니다. 포인터는 일부 C 프로그래밍 작업의 실행을 단순화하며 동적 메모리 할당과 같은 일부 작업은 포인터 없이 수행할 수 없습니다. 그러므로 훌륭한 C 프로그래머가 되려면 포인터를 배우는 것이 필요합니다.

아시다시피 모든 변수에는 메모리 위치가 있으며 각 메모리 위치는 메모리의 주소를 나타내는 하이픈(&) 연산자를 사용하여 액세스할 수 있는 주소를 정의합니다. 다음 예를 참조하세요. 정의된 변수 주소가 출력됩니다.

#include <stdio.h>int main (){   int  var1;   char var2[10];

   printf("var1 变量的地址: %x\n", &var1  );
   printf("var2 变量的地址: %x\n", &var2  );   return 0;}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

var1 变量的地址: bff5a400
var2 变量的地址: bff5a3f6

위 예를 통해 우리는 메모리 주소가 무엇인지, 어떻게 작동하는지 이해합니다. 그것에 액세스하십시오. 다음으로 포인터가 무엇인지 살펴보겠습니다.

포인터란 무엇인가요?

포인터는 값이 다른 변수의 주소, 즉 메모리 위치의 직접 주소인 변수입니다. 다른 변수나 상수와 마찬가지로 포인터를 사용하여 다른 변수의 주소를 저장하기 전에 포인터를 선언해야 합니다. 포인터 변수 선언의 일반적인 형식은 다음과 같습니다.

type *var-name;

여기서 type은 포인터의 기본 유형이며 유효한 C 데이터 유형이어야 하며 var-name은 포인터 변수의 이름입니다. 포인터를 선언하는 데 사용되는 별표 *는 곱셈에 사용되는 것과 동일합니다. 그러나 이 명령문에서는 별표를 사용하여 변수가 포인터임을 지정합니다. 다음은 유효한 포인터 선언입니다.

int    *ip;    /* 一个整型的指针 */double *dp;    /* 一个 double 型的指针 */float  *fp;    /* 一个浮点型的指针 */char   *ch     /* 一个字符型的指针 */

정수, 부동 소수점, 문자 또는 기타 데이터 유형이든 모든 포인터 값의 실제 데이터 유형은 동일하며 메모리 주소를 나타내는 긴 값입니다. 숫자. 서로 다른 데이터 유형의 포인터 간의 유일한 차이점은 포인터가 가리키는 변수 또는 상수의 데이터 유형입니다.

포인터를 사용하는 방법은 무엇입니까?

포인터를 사용할 때 포인터 변수를 정의하고, 변수 주소를 포인터에 할당하고, 포인터 변수에서 사용 가능한 주소 값에 액세스하는 작업이 자주 수행됩니다. 이는 단항 연산자 *를 사용하여 피연산자가 지정한 주소에 있는 변수의 값을 반환함으로써 수행됩니다. 다음 예에는 이러한 작업이 포함됩니다.

#include <stdio.h>int main (){   int  var = 20;   /* 实际变量的声明 */   int  *ip;        /* 指针变量的声明 */

   ip = &var;  /* 在指针变量中存储 var 的地址 */

   printf("Address of var variable: %x\n", &var  );   /* 在指针变量中存储的地址 */
   printf("Address stored in ip variable: %x\n", ip );   /* 使用指针访问值 */
   printf("Value of *ip variable: %d\n", *ip );   return 0;}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Address of var variable: bffd8b3cAddress stored in ip variable: bffd8b3cValue of *ip variable: 20

C의 NULL 포인터

변수가 선언될 때 할당할 정확한 주소가 없는 경우 에 값을 할당하는 경우 포인터 변수에 NULL 값을 할당하는 것은 좋은 프로그래밍 습관입니다. NULL 값이 할당된 포인터를 null포인터라고 합니다.

NULL 포인터는 표준 라이브러리에 0 값으로 정의된 상수입니다. 아래 프로그램을 보세요:

#include <stdio.h>int main (){   int  *ptr = NULL;

   printf("ptr 的值是 %x\n", ptr  ); 
   return 0;}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나타납니다.

ptr 的值是 0

대부분의 운영 체제에서 프로그램은 주소 0에 있는 메모리에 액세스하는 것이 허용되지 않습니다. 운영 체제. 그러나 메모리 주소 0은 포인터가 액세스 가능한 메모리 위치를 가리키지 않는다는 것을 나타내기 때문에 특별한 의미를 갖습니다. 그러나 관례에 따라 포인터에 null(0 값)이 포함되어 있으면 아무 것도 가리키지 않는 것으로 간주됩니다.

널 포인터를 확인하려면 아래와 같이 if 문을 사용할 수 있습니다.

if(ptr)     /* 如果 p 非空,则完成 */if(!ptr)    /* 如果 p 为空,则完成 */

C 포인터에 대한 자세한 설명

C에는 포인터 관련 개념이 많이 있는데 이러한 개념은 간단하지만 모두 중요합니다. 아래에는 C 프로그래머가 알아야 할 중요한 포인터 관련 개념이 나열되어 있습니다.

ConceptDescription
포인터에 대한 산술 연산포인터에 대해 네 가지 산술 연산을 수행할 수 있습니다: ++, --, +, -
포인터 배열은 포인터를 저장하도록 정의할 수 있습니다. 정렬.
포인터 대 포인터C는 포인터 대 포인터를 허용합니다.
함수에 포인터를 전달합니다. 전달된 매개변수가 호출 함수에서 변경되도록 참조 또는 주소로 매개변수를 전달합니다.
함수에서 포인터 반환C를 사용하면 함수가 지역 변수, 정적 변수 및 동적 메모리 할당에 대한 포인터를 반환할 수 있습니다.