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;
포인터의 장점
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이고 반환 유형이 다음과 같은 함수에 대한 포인터로 받아들이는 함수에 대한 포인터로 읽혀집니다. 정수.