C++ 예제가 포함된 포인터
포인터란 무엇입니까?
In C++에서 포인터는 다른 변수의 주소를 보유하는 변수를 나타냅니다. 일반 변수와 마찬가지로 포인터에도 데이터 유형이 있습니다. 예를 들어, 정수 유형의 포인터는 정수 유형의 변수 주소를 보유할 수 있습니다. 문자 유형의 포인터는 문자 유형의 변수 주소를 보유할 수 있습니다.
포인터는 메모리 주소를 상징적으로 표현한 것으로 보아야 합니다. 포인터를 사용하면 프로그램에서 참조별 호출을 시뮬레이션할 수 있습니다. 또한 동적 데이터 구조를 생성하고 조작할 수도 있습니다. ~ 안에 C++에서 포인터 변수는 다른 변수가 가리키는 메모리의 특정 주소를 가리키는 변수를 말한다.
주소 C++
이해하다 C++ 포인터를 사용하려면 컴퓨터가 데이터를 저장하는 방법을 이해해야 합니다.
당신이 변수를 만들 때 C++ 프로그램에는 컴퓨터 메모리에 일부 공간이 할당됩니다. 이 변수의 값은 할당된 위치에 저장됩니다.
데이터가 저장된 컴퓨터 메모리의 위치를 확인하려면 C++ 제공 & (참조) 연산자. 연산자는 변수가 차지하는 주소를 반환합니다.
예를 들어 x가 변수인 경우 &x는 변수의 주소를 반환합니다.
포인터 선언 구문
선언 C++ 다음 구문을 사용합니다:
datatype *variable_name;
- 데이터 유형은 유효한 포인터의 기본 유형입니다. C++ 데이터 형식.
- Variable_name은 포인터 변수의 이름이어야 합니다.
- 포인터 선언에 위에서 사용된 별표는 곱셈 연산을 수행하는 데 사용된 별표와 유사합니다. 변수를 포인터로 표시하는 것은 별표입니다.
다음은 유효한 포인터 선언의 예입니다. C++:
int *x; // a pointer to integer double *x; // a pointer to double float *x; // a pointer to float char *ch // a pointer to a character
참조 연산자(&)와 참조 연산자(*)
참조 연산자(&)는 변수의 주소를 반환합니다.
역참조 연산자(*)는 메모리 주소에 저장된 값을 얻는 데 도움이 됩니다.
예 :
num이라는 이름의 변수가 있으면 주소 0x234에 저장되고 값 28이 저장됩니다.
참조 연산자(&)는 0x234를 반환합니다.
역참조 연산자(*)는 5를 반환합니다.
예 1 :
#include <iostream> using namespace std; int main() { int x = 27; int *ip; ip = &x; cout << "Value of x is : "; cout << x << endl; cout << "Value of ip is : "; cout << ip<< endl; cout << "Value of *ip is : "; cout << *ip << endl; return 0; }
출력:
작동 원리 :
다음은 코드의 스크린샷입니다.
코드 설명 :
- iostream 헤더 파일을 가져옵니다. 이렇게 하면 헤더 파일에 정의된 함수를 오류 없이 사용할 수 있습니다.
- 클래스를 호출하지 않고 사용하려면 std 네임스페이스를 포함하세요.
- main() 함수를 호출합니다. 프로그램 로직은 이 함수의 본문 내에 추가되어야 합니다. {는 함수 본문의 시작을 표시합니다.
- 정수 변수 x를 선언하고 값 27을 할당합니다.
- 포인터 변수 *ip를 선언합니다.
- 변수 x의 주소를 포인터 변수에 저장합니다.
- 콘솔에 일부 텍스트를 인쇄합니다.
- 변수 x의 값을 화면에 인쇄합니다.
- 콘솔에 일부 텍스트를 인쇄합니다.
- 변수 x의 주소를 출력합니다. 주소 값은 변수 ip에 저장되었습니다.
- 콘솔에 일부 텍스트를 인쇄합니다.
- 포인터의 주소에 저장된 값을 인쇄합니다.
- 프로그램은 성공적으로 실행되면 값을 반환해야 합니다.
- main() 함수 본문의 끝입니다.
포인터와 배열
배열과 포인터는 관련 개념을 기반으로 작동합니다. 포인터가 있는 배열로 작업할 때 주의해야 할 사항이 여러 가지 있습니다. 배열 이름 자체는 배열의 기본 주소를 나타냅니다. 즉, 배열의 주소를 포인터에 할당하려면 앰퍼샌드(&)를 사용하면 안 됩니다.
예 :
p = arr;
arr은 배열의 주소를 나타내기 때문에 위의 내용은 정확합니다. 또 다른 예는 다음과 같습니다.
p = &arr;
위의 내용은 올바르지 않습니다.
암시적으로 배열을 포인터로 변환할 수 있습니다. 예를 들어:
int arr [20]; int * ip;
유효한 작업은 다음과 같습니다.
ip = arr;
위 선언 이후 ip와 arr은 동일하며 속성을 공유합니다. 하지만 ip에는 다른 주소를 할당할 수 있지만 arr에는 아무 것도 할당할 수 없습니다.
예 2 :
이 예에서는 포인터를 사용하여 배열을 탐색하는 방법을 보여줍니다.
#include <iostream> using namespace std; int main() { int *ip; int arr[] = { 10, 34, 13, 76, 5, 46 }; ip = arr; for (int x = 0; x < 6; x++) { cout << *ip << endl; ip++; } return 0; }
출력:
다음은 코드의 스크린샷입니다.
코드 설명 :
- 정수 포인터 변수 ip를 선언합니다.
- arr이라는 배열을 선언하고 6개의 정수를 저장합니다.
- arr을 ip에 할당합니다. ip와 arr은 동일해집니다.
- for 루프를 만듭니다. 루프 변수 x는 인덱스 0에서 5까지 배열 요소를 반복하기 위해 생성되었습니다.
- 포인터 IP의 주소에 저장된 값을 출력합니다. 반복당 하나의 값이 반환되며 총 6번의 반복이 수행됩니다. 엔드는 C++ 끝줄을 뜻하는 키워드. 이 작업을 사용하면 각 값이 인쇄된 후 커서를 다음 줄로 이동할 수 있습니다. 각 값은 개별 라인에 인쇄됩니다.
- 매 반복 후에 포인터를 다음 int 위치로 이동합니다.
- for 루프의 끝입니다.
- 프로그램은 성공적으로 실행되면 무언가를 반환해야 합니다.
- main() 함수 본문의 끝입니다.
NULL 포인터
할당할 정확한 주소가 없으면 포인터 변수에 NULL을 할당할 수 있습니다. 선언하는 동안 수행되어야 합니다. 이러한 포인터를 널 포인터라고 합니다. 그 값은 XNUMX이며 iostream과 같은 많은 표준 라이브러리에 정의되어 있습니다.
예 3 :
#include <iostream> using namespace std; int main() { int *ip = NULL; cout << "Value of ip is: " << ip; return 0; }
출력:
다음은 코드의 스크린샷입니다.
코드 설명 :
- 포인터 변수 ip를 선언하고 NULL 값을 할당합니다.
- 콘솔의 일부 텍스트와 함께 포인터 변수 ip의 값을 인쇄합니다.
- 프로그램은 성공적으로 완료되면 값을 반환해야 합니다.
- main() 함수 본문의 끝입니다.
변수 포인터
와 C++, 컴퓨터 메모리에서 직접 데이터를 조작할 수 있습니다.
메모리 공간은 원하는 대로 할당되거나 재할당될 수 있습니다. 이는 포인터 변수를 통해 가능해졌습니다.
포인터 변수는 다른 변수가 가리키는 컴퓨터 메모리의 특정 주소를 가리킵니다.
다음과 같이 선언할 수 있습니다.
int *p;
또는,
int* p;
예제에서는 포인터 변수 p를 선언했습니다.
메모리 주소를 보유하게 됩니다.
별표는 포인터를 의미하는 역참조 연산자입니다.
포인터 p는 메모리 주소의 정수 값을 가리키고 있습니다.
예 4 :
#include <iostream> using namespace std; int main() { int *p, x = 30; p = &x; cout << "Value of x is: " << *p; return 0; }
출력:
다음은 코드의 스크린샷입니다.
코드 설명 :
- 포인터 변수 p와 변수 x를 값 30으로 선언합니다.
- 변수 x의 주소를 p에 할당합니다.
- 콘솔의 일부 텍스트와 함께 포인터 변수 p의 값을 인쇄합니다.
- 프로그램은 성공적으로 완료되면 값을 반환해야 합니다.
- main() 함수 본문의 끝입니다.
포인터의 적용
기능 C++ 하나의 값만 반환할 수 있습니다. 또한 함수에서 선언된 모든 변수는 함수 호출 스택에 할당됩니다. 함수가 반환하자마자 모든 스택 변수가 파괴됩니다.
함수에 대한 인수는 값으로 전달되고 변수에 대한 수정은 전달되는 실제 변수의 값을 변경하지 않습니다. 다음 예는 이 개념을 설명하는 데 도움이 됩니다.
예 5 :
#include <iostream> using namespace std; void test(int*, int*); int main() { int a = 5, b = 5; cout << "Before changing:" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; test(&a, &b); cout << "\nAfter changing" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; } void test(int* n1, int* n2) { *n1 = 10; *n2 = 11; }
출력:
다음은 코드의 스크린샷입니다.
코드 설명 :
- 두 개의 정수 매개변수를 사용하는 test라는 함수의 프로토타입을 만듭니다.
- main() 함수를 호출합니다. 본문 내부에 프로그램 논리를 추가하겠습니다.
- 각각 값이 5인 두 개의 정수 변수 a와 b를 선언합니다.
- 콘솔에 일부 텍스트를 인쇄합니다. endl(끝 라인)은 커서를 이동하여 다음 라인에서 인쇄를 시작합니다.
- 다른 텍스트와 함께 콘솔에 변수 a의 값을 인쇄합니다. endl(끝 라인)은 커서를 이동하여 다음 라인에서 인쇄를 시작합니다.
- 다른 텍스트와 함께 콘솔에 변수 b의 값을 인쇄합니다. endl(끝 라인)은 커서를 이동하여 다음 라인에서 인쇄를 시작합니다.
- 변수 a와 b의 주소를 매개변수로 사용하는 test()라는 함수를 만듭니다.
- 콘솔에 일부 텍스트를 인쇄합니다. \n은 텍스트가 인쇄되기 전에 새로운 빈 줄을 만듭니다. endl(끝 줄)은 텍스트가 인쇄된 후 다음 줄에서 인쇄를 시작하도록 커서를 이동합니다.
- 다른 텍스트와 함께 콘솔에 변수 a의 값을 인쇄합니다. endl(끝 라인)은 커서를 이동하여 다음 라인에서 인쇄를 시작합니다.
- 다른 텍스트와 함께 콘솔에 변수 b의 값을 인쇄합니다. endl(끝 라인)은 커서를 이동하여 다음 라인에서 인쇄를 시작합니다.
- 프로그램은 성공적으로 완료되면 값을 반환해야 합니다.
- main() 함수 본문의 끝입니다.
- test() 함수를 정의합니다. 함수는 두 개의 정수 포인터 변수 *n1과 *n2를 사용해야 합니다.
- 포인터 변수 *n1에 값 10을 할당합니다.
- 포인터 변수 *n2에 값 11을 할당합니다.
- test() 함수 본문의 끝입니다.
함수 테스트 내부에서는 변수 a, b에 새로운 값을 할당하더라도 함수 호출이 완료되면 외부 함수 main에는 반영되지 않습니다.
포인터를 함수 인수로 사용하면 변수의 실제 주소를 함수에 전달하는 데 도움이 되며 변수에 수행된 모든 변경 사항은 외부 함수에 반영됩니다.
위의 경우 'test' 함수는 변수 'a'와 'b'의 주소를 가지고 있습니다. 이 두 변수는 'test' 함수에서 직접 액세스할 수 있으므로 이러한 변수에 대한 모든 변경 사항은 호출자 함수 'main'에 반영됩니다.
포인터 사용의 장점
포인터 사용의 장점/이점은 다음과 같습니다.
- 포인터는 다른 포인터의 주소를 저장하는 변수입니다. 변수 C++.
- 포인터를 사용하여 함수에서 둘 이상의 변수를 수정하고 반환할 수 있습니다.
- 포인터를 사용하여 메모리를 동적으로 할당하고 할당 해제할 수 있습니다.
- 포인터는 프로그램의 복잡성을 단순화하는 데 도움이 됩니다.
- 포인터를 사용하면 프로그램의 실행 속도가 향상됩니다.
제품 개요
- 포인터는 다른 변수의 주소를 보유하는 변수를 나타냅니다.
- 각 포인터에는 유효한 데이터 유형이 있습니다.
- 포인터는 메모리 주소를 상징적으로 표현한 것입니다.
- 포인터를 사용하면 프로그램이 참조별 호출을 시뮬레이션하고 동적 데이터 구조를 생성 및 조작할 수 있습니다.
- 배열 포인터는 관련 개념을 사용합니다.
- 배열 이름은 배열의 기본을 나타냅니다.
- 배열의 주소를 포인터에 할당하려면 앰퍼샌드(&)를 사용하지 마세요.
- 포인터 변수를 할당할 특정 주소가 없으면 NULL을 할당합니다.