pointers pointer operations c
포인터와 C ++에서의 사용에 대한 집중 연구.
포인터는 C ++ 언어의 가장 강력한 기능 중 하나입니다. 포인터는 주소를 통해 변수를 조작하는 데 도움이됩니다.
삽입 정렬 코드 C ++
이 튜토리얼에서는 포인터와 C ++에서의 사용에 대한 모든 것을 자세히 살펴볼 것입니다.
학습 내용 :
포인터 란?
포인터는 메모리 위치의 주소를 보유하는 변수입니다. 우리가 선언하는 모든 변수는 메모리에 특정 주소가 있음을 알고 있습니다. 메모리에서 이러한 주소를 가리키는 포인터 변수를 선언합니다.
포인터 변수를 선언하는 일반적인 구문은 다음과 같습니다.
datatype * variable_name;
예를 들어, 선언 int * ptr;
이것은 ptr이 int 유형의 변수를 가리키는 포인터임을 의미합니다. 따라서 포인터 변수에는 항상 메모리 위치 또는 주소가 포함됩니다. 아래에서 포인터 변수의 작동을 살펴 보겠습니다.
다음과 같은 선언이 있다고 가정합니다.
Int p, *ptr; //declare variable p and pointer variable ptr p = 4; //assign value 4 to variable p ptr = &p; //assign address of p to pointer variable ptr
메모리에서 이러한 선언은 다음과 같이 표시됩니다.
이것은 메모리에있는 포인터의 내부 표현입니다. 주소 변수를 포인터 변수에 할당하면 위의 표현과 같이 변수를 가리 킵니다.
ptr에 변수 p의 주소가 있으므로 * ptr은 변수 p의 값을 제공합니다 (포인터 변수 ptr이 가리키는 변수).
노트 : 포인터와 함께 사용하는 연산자 *는 그것이 포인터 변수임을 표시하는 데 사용됩니다.
C ++에서 사용되는 몇 가지 포인터 개념을 살펴 보겠습니다.
포인터 산술
포인터 변수는 항상 메모리의 주소를 가리 킵니다. 수행 할 수있는 연산 중 포인터에 대해 수행되는 다음과 같은 산술 연산이 있습니다.
- 증가 연산자 (++)
- 감소 연산자 (–)
- 더하기 (+)
- 빼기 (-)
예제 프로그램에서 이러한 작업의 사용법을 살펴 보겠습니다.
#include #include using namespace std; int main() { int myarray(5) = {2, 4,6, 8,10}; int* myptr; myptr = myarray; cout<<'First element in the array :'<<*myptr< 산출:
배열의 첫 번째 요소 : 2
배열의 다음 요소 : 4
배열의 다음 요소 : 6
배열의 다음 요소 : 4
배열의 다음 요소 : 2
우리는 포인터에서 수행되는 산술 연산을 보았습니다. 증가 연산자 ++는 포인터를 증가시키고 배열의 다음 요소를 가리 킵니다. 마찬가지로 감소 연산자는 포인터 변수를 1 씩 감소시켜 배열의 이전 요소를 가리 킵니다.
+ 및 – 연산자도 사용합니다. 먼저 포인터 변수에 1을 추가했습니다. 결과는 배열의 다음 요소를 가리킴을 보여줍니다. 마찬가지로 – 연산자는 포인터 변수가 배열의 이전 요소를 가리 키도록합니다.
이러한 산술 연산자 외에도 ==,와 같은 비교 연산자를 사용할 수도 있습니다.
Null 및 Void 포인터
포인터 변수에 변수 주소가 할당되지 않은 경우 포인터 변수에 NULL 값을 할당하는 것이 좋습니다. NULL 값을 가진 포인터 변수를 NULL 포인터라고합니다.
널 포인터는 iostream 헤더에 정의 된 값이 0 인 상수 포인터입니다. 주소 0의 메모리는 운영 체제에 의해 예약되어 있으며이 위치에 액세스 할 수 없습니다.
널 포인터를 사용하면 사용하지 않는 포인터의 오용을 피하고 포인터 변수에 일부 가비지 값이 할당되는 것을 방지 할 수 있습니다.
Void 포인터는 유형이없는 값을 가리키는 특수 포인터입니다. void 포인터는 모든 유형을 가리킬 수 있으므로 더 유연합니다. 그러나 그들은 직접 역 참조 될 수 없습니다. 역 참조의 경우 void 포인터를 구체적인 데이터 유형의 값을 가리키는 포인터로 변환해야합니다.
다음 코드 예제에서 NULL 포인터 및 void 포인터의 작동을 보여주었습니다.
#include #include using namespace std; int main() { int intvar = 10; char c = 'A'; void* vptr; int* myptr = NULL; cout<<'NULL pointer value :'< 산출:
NULL 포인터 값 : 0
Void 포인터 vptr은 다음을 가리 킵니다.
Void 포인터 vptr은 다음을 가리 킵니다.
위의 프로그램에서 먼저 NULL 값이 할당 된 정수 포인터를 선언합니다. 이 포인터를 인쇄하면 앞에서 논의한 것처럼 값이 0임을 알 수 있습니다.
다음으로 void 포인터를 선언합니다. 먼저이 void 포인터에 문자 변수의 주소를 할당합니다. 그런 다음 void 포인터를 문자 포인터에 할당하고 char *로 형변환합니다. 다음으로, 앞에서 선언 한 문자 변수이고 void 포인터가 가리키는 char A를 가리키는 charptr 값을 인쇄합니다.
다음으로 void 포인터에 정수 변수를 할당 한 다음 정수 포인터를 사용하여이 void 포인터를 역 참조하는 동일한 단계를 수행합니다.
배열과 포인터
배열과 포인터는 서로 밀접하게 연관되어 있습니다. 우리는 배열의 이름이 배열의 첫 번째 요소를 가리키고 이것은 상수 포인터라는 것을 알고 있습니다.
이 포인터를 포인터 변수에 할당 한 다음 포인터를 감소 시키거나 첨자 연산자를 사용하여 배열에 액세스 할 수 있습니다.
다음 코드 예제에서 포인터 변수와 배열 간의 이러한 연관성을 볼 수 있습니다.
#include #include using namespace std; int main() { int myarray(5) = {1, 1, 2, 3, 5}; int* ptrvar; ptrvar = myarray; for(int i=0;i<5;i++) { cout<<*ptrvar<<' '; ptrvar++; } return 0; }
산출:
1 1 2 3 5
위의 프로그램에서 포인터 변수에 배열 이름을 할당합니다. 배열 이름이 배열의 첫 번째 요소를 가리 키므로 포인터 변수를 사용하여 전체 배열의 내용을 인쇄하고 ++ 연산자를 사용하여 증가시킬 수 있습니다. 이것은 출력에 표시됩니다.
포인터 배열
때로는 프로그램에 하나 이상의 포인터 변수가 필요합니다. 각 개별 포인터 변수를 선언하는 대신 포인터 배열을 선언 할 수 있습니다.
홈 연결을위한 최고의 ddos 방법
포인터 배열을 보여주기 위해 예제를 곧바로 살펴 보겠습니다.
#include #include using namespace std; int main() { int myarray(5) = {2,4,6,8,10}; int *ptr(5); //array of pointers for(int i=0;i<5;i++){ ptr(i) = &myarray(i); } for (int i = 0; i < 5; i++) { cout << 'Value of myarray(' << i << ') = '; cout << *ptr(i) << endl; } return 0; }
산출:
myarray (0)의 값 = 2
myarray (1)의 값 = 4
myarray (2)의 값 = 6
myarray (3)의 값 = 8
myarray (4)의 값 = 10
위의 선언에서
int * ptr (5);
우리는 다음과 같이 해석 할 수 있습니다. ptr은 5 개의 정수 포인터 배열입니다. 따라서 ptr의 각 요소는 정수 유형의 변수를 가리 킵니다.
정수 배열을 사용하고 배열의 각 요소 주소를 각 ptr 요소에 할당합니다. 그런 다음“* ptr (i)”를 출력하여 ptr 배열의 내용을 표시합니다.
포인터 포인터
포인터의 포인터는 다중 간접적 일뿐입니다. 일종의 포인터 체인입니다. 포인터의 포인터를 정의 할 때 첫 번째 포인터는 두 번째 포인터의 주소를 가지며, 차례로 가리키는 변수의 주소를 갖습니다.
메모리에서는 다음과 같이 표시됩니다.

포인터의 포인터는 다음과 같이 선언됩니다.
int** intptr;
포인터의 포인터를 더 잘 이해하기 위해 코드 예제를 직접 사용합니다.
#include #include using namespace std; int main() { int *vptr; int ** intptr; int var = 10; vptr = &var; intptr = &vptr; cout<<'Variable var: '< 산출:
변수 변수 : 10
변수에 대한 포인터 : 10
변수에 대한 포인터 : 10
위의 프로그램에서 정수 변수, 정수 포인터 및 정수 포인터의 포인터를 선언합니다. 프로그램에서 볼 수 있듯이 포인터 변수에는 변수 값이 할당됩니다. 포인터 변수의 포인터에는 포인터 변수의 주소가 할당됩니다.
마지막으로 정수 변수와 동일한 값 10을 표시하는 세 개의 변수를 인쇄합니다.
함수에 포인터 전달
함수에 포인터를 전달하는 것은 포인터 변수를 함수에 전달하는 다른 매개 변수 전달 기술과 동일합니다.
우리는 두 값을 교체하고 포인터 변수를 매개 변수로 전달하도록 수정합니다.
#include #include using namespace std; void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a, b; cout<>a>>b; cout<<'a = '< 산출:
교체 할 값을 입력하십시오. 3 2
a = 3 b = 2
스왑 된 값
a = 2 b = 3
프로그램에서 볼 수 있듯이 스왑 할 값을 정수 변수로 전달합니다. 형식 매개 변수는 포인터 변수로 정의됩니다. 그 결과 함수 내부의 변수에 대한 변경 사항은 호출 함수 외부에서도 반영됩니다.
기능 포인터
같은 방식으로 변수, 배열 등에 대한 포인터가 있으므로 함수에 대한 포인터도 가질 수 있습니다. 그러나 차이점은 함수 포인터가 변수 나 배열과 같은 데이터가 아니라 실행 코드를 가리킨다는 것입니다.
함수 포인터를 보여주기 위해 예제를 사용합니다.
#include #include using namespace std; void displayVal(int a) { printf('Value of a is %d
', a); } int main() { void (*func_ptr)(int) = &displayVal; (*func_ptr)(100); return 0; }
산출:
a의 값은 100입니다.
파이썬 대 C ++ 구문
위의 프로그램에는 전달 된 정수 값만 출력하는 'displayVal'함수가 있습니다. main 함수에서 우리는 int를 인자로 받아서 void 타입을 반환하는 함수 포인터 'func_ptr'을 정의했습니다.
무효 (* func_ptr) (정수)
노트 : 함수 포인터를 () 안에 넣어야합니다. 생략하면 함수 프로토 타입이됩니다.
이 함수 포인터에 'displayVal'함수의 주소를 할당했습니다. 그런 다음이 함수 포인터‘func_ptr’을 사용하여 인수 100으로 displayVal을 호출하는 것과 동일한 인수 값 100을 전달합니다.
이제 동일한 프로토 타입을 가진 다른 함수가있는 경우 함수의 주소를 할당하여 동일한 함수 포인터를 사용할 수 있습니다. 이것이 함수 포인터의 주요 용도입니다.
결론
이것은 포인터, 정의 및 C ++에서의 사용에 관한 것입니다.
다음 자습서에서는 C ++의 참조에 대해 자세히 알아 봅니다. 참조는 또한 C ++에서 특별한 용도로 사용되며 종종 변수의 별칭으로 사용됩니다.
=> Absolute C ++ 교육 시리즈를 보려면 여기를 클릭하십시오.
추천 도서