logo

C 포인터

C 언어에서 포인터는 다른 변수의 주소를 저장하는 변수입니다. 이 변수는 int, char, 배열, 함수 또는 기타 포인터 유형일 수 있습니다. 포인터의 크기는 아키텍처에 따라 다릅니다. 그러나 32비트 아키텍처에서는 포인터의 크기가 2바이트입니다.

정수의 주소를 저장하는 포인터를 정의하려면 다음 예를 고려하십시오.

 int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer. 

포인터 선언

C 언어의 포인터는 *(별표 기호)를 사용하여 선언할 수 있습니다. 포인터를 역참조하는 데 사용되는 간접 포인터라고도 합니다.

 int *a;//pointer to int char *c;//pointer to char 

포인터 예

주소와 값을 인쇄하기 위해 포인터를 사용하는 예는 다음과 같습니다.

포인터 예

위 그림에서 볼 수 있듯이 포인터 변수는 숫자 변수의 주소, 즉 fff4를 저장합니다. number 변수의 값은 50입니다. 그런데 포인터 변수 p의 주소는 aaa3입니다.

* (의 도움으로 간접 연산자 ), 포인터 변수 p의 값을 인쇄할 수 있습니다.

자바 문자열 조인

위 그림에 설명된 포인터 예제를 살펴보겠습니다.

 #include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x 
',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d 
',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; } 

산출

 Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50 

배열에 대한 포인터

 int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr. 

함수에 대한 포인터

 void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function 

구조에 대한 포인터

 struct st { int i; float f; }ref; struct st *p = &ref; 
c 포인터

포인터의 장점

1) 포인터 코드를 줄인다 그리고 성능을 향상시킨다 , 문자열, 트리 등을 검색하는 데 사용되며 배열, 구조 및 함수와 함께 사용됩니다.

2) 우리는 할 수 있다 함수에서 여러 값을 반환 포인터를 사용합니다.

3) 그것은 당신이 할 수 있게 해준다 모든 메모리 위치에 접근 컴퓨터의 메모리에.

포인터의 사용법

C언어에는 포인터를 적용하는 방법이 많이 있습니다.

1) 동적 메모리 할당

C 언어에서는 포인터가 사용되는 malloc(), calloc() 함수를 사용하여 메모리를 동적으로 할당할 수 있습니다.

퀵 정렬 알고리즘

2) 배열, 함수, 구조

C 언어의 포인터는 배열, 함수, 구조에 널리 사용됩니다. 코드를 줄이고 성능을 향상시킵니다.

(&) 운영자 주소

연산자 '&'의 주소는 변수의 주소를 반환합니다. 하지만 변수의 주소를 표시하려면 %u를 사용해야 합니다.

 #include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; } 

산출

누군가 안드로이드에서 당신을 차단했는지 확인하는 방법
 value of number is 50, address of number is fff4 

NULL 포인터

값이 할당되지 않고 NULL인 포인터를 NULL 포인터라고 합니다. 선언 시 포인터에 지정할 주소가 없으면 NULL 값을 할당할 수 있습니다. 더 나은 접근 방식을 제공할 것입니다.

 int *p=NULL; 

대부분의 라이브러리에서 포인터 값은 0(영)입니다.

세 번째 변수를 사용하지 않고 두 숫자를 바꾸는 포인터 프로그램입니다.

 #include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf('
After swap: *p1=%d *p2=%d',*p1,*p2); return 0; } 

산출

 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

복잡한 포인터 읽기

C에서 복잡한 포인터를 읽는 동안 고려해야 할 몇 가지 사항이 있습니다. 포인터와 관련하여 사용되는 연산자의 우선 순위와 연관성을 살펴보겠습니다.

운영자상위연관성
(), []1왼쪽에서 오른쪽으로
*, 식별자2오른쪽에서 왼쪽으로
데이터 형식-

여기서 우리는 다음을 주목해야 합니다.

  • (): 이 연산자는 함수를 선언하고 정의하는 데 사용되는 대괄호 연산자입니다.
  • []: 이 연산자는 배열 첨자 연산자입니다.
  • * : 이 연산자는 포인터 연산자입니다.
  • 식별자: 포인터의 이름입니다. 우선순위는 항상 여기에 할당됩니다.
  • 데이터 유형: 데이터 유형은 포인터가 가리키는 변수의 유형입니다. 또한 signed int, long 등과 같은 수정자를 포함합니다.

포인터를 읽는 방법: int (*p)[10].

포인터를 읽으려면 ()와 []의 우선순위가 동일하다는 것을 알아야 합니다. 따라서 여기서는 연관성을 고려해야 합니다. 연관성은 왼쪽에서 오른쪽이므로 우선순위는 ()입니다.

대괄호() 안의 포인터 연산자 *와 포인터 이름(식별자) p는 동일한 우선순위를 갖습니다. 따라서 여기서는 오른쪽에서 왼쪽으로 연관성을 고려해야 하므로 우선순위는 p가 되고 두 번째 우선순위는 *가 됩니다.

데이터 유형이 마지막 우선순위를 가지므로 []에 세 번째 우선순위를 지정하십시오. 따라서 포인터는 다음과 같습니다.

  • 문자 -> 4
  • * -> 2
  • 피 -> 1
  • [10] -> 3

포인터는 p가 크기 10의 정수 배열에 대한 포인터이므로 읽혀집니다.

문자열 포맷터

다음 포인터를 읽는 방법은 무엇입니까?

 int (*p)(int (*)[2], int (*)void)) 

설명

이 포인터는 p가 첫 번째 매개변수를 크기가 2인 정수의 1차원 배열에 대한 포인터로 받아들이고 두 번째 매개변수를 매개변수가 void이고 반환 유형이 다음과 같은 함수에 대한 포인터로 받아들이는 함수에 대한 포인터로 읽혀집니다. 정수.