포인터 기반 데이터 형식 및 포인터 연산 소결
정의.
속뜻
int i;
정의 성형 변수
int *p;
정형 데이터 만 을 위 한 포인터 변수 p 정의
int a[n];
성형 배열 a 를 정의 합 니 다.n 개의 요소 가 있 습 니 다.
int *p[n];
포인터 배열 p 를 정의 합 니 다.성형 데이터 형식 을 가리 키 는 포인터 요소 로 구성 되 어 있 습 니 다.
int (*p)[n];
n 개 요 소 를 가리 키 는 배열 의 포인터 변 수 를 정의 합 니 다.
int f();
f.성형 편지 수 치 를 가 져 오기 위 한 함수
int *p();
p 는 포인터 의 함 수 를 가 져 오기 위해 성형 데 이 터 를 가리 키 고 있 습 니 다.
int (*p)();
p 는 함 수 를 가리 키 는 지침 입 니 다.이 함 수 는 성형 데 이 터 를 되 돌려 줍 니 다.
int * *p;
p 는 포인터 의 포인터 변 수 를 가리 키 며 성형 데이터 의 포인터 변 수 를 가리킨다.2.포인터 의 연산 소결(1)포인터 변수의 할당
int a;
int *p
p=&a;
은 변수 a 의 주 소 를 p
int a[3]={1,2,3};
int *p;
p=a;
에 부여 하고 배열 의 첫 번 째 요소 의 주 소 를 포인터 p
int a[3]={1,2,3};
int *p;
p=&a[2];
에 부여 한다.f 의 입구 주 소 를 p
int main(){
int f(int z);
int (*p)(int z);
p=f;
p(5);
}
int f(int z ){
cout<<z<<endl;
}
p1 과 p2 에 부여 하고 p1 의 값 을 p2 에 부여 합 니 다.(2)포인터 변수 에 빈 값 을 부여 하 는 포인터 변 수 는 빈 값 을 가 질 수 있 습 니 다.즉,이 포인터 변 수 는 변 수 를 가리 키 지 않 습 니 다.
int a=3;
int *p1=&a;
int *p2=p1;
실제 NULL 은 정수 0 을 대표 합 니 다.즉,p 가 주 소 를 0 으로 가리 키 는 단원 입 니 다.이렇게 하면 바늘 이 어떤 효과 적 인 단원 도 가리 키 지 않 게 할 수 있다.실제 시스템 은 NULL:
p=NULL;
C++에서 iostream 헤더 파일 에 이상 의 NULL 정 의 를 포함 하고 NULL 은 하나의 기 호 를 상수 로 합 니 다.C-free 편집기 에서 실행:
#define NULL 0
p 의 값 은 NULL 과 p 가 부여 되 지 않 은 두 개념 임 을 주의해 야 합 니 다.전 자 는 가치 가 있 습 니 다(값 은 0).그 어떠한 변 수 를 가리 키 지 않 습 니 다.후 자 는 p 에 값 을 부여 하지 않 았 지만 p 에 값 이 없 는 것 과 같 지 않 습 니 다.다만 그 값 은 예측 할 수 없 는 값 입 니 다.즉,p 는 지정 되 지 않 은 단원 을 가리 킬 수 있 습 니 다.이런 상황 은 매우 위험 하 다.따라서 변 수 를 마 시기 전에 반드시 값 을 부여 해 야 한다.모든 포인터 변수 나 주 소 는 NULL 과 같 거나 다른 비 교 를 할 수 있 습 니 다.
#include<iostream>
using namespace std;
int main(){
cout<<NULL;
cout<<endl;
}
위의 문 구 는 다음 과 같이 쓸 수 있 습 니 다.
if(p==NULL)p=p1;
int*p=NULL 도 주의해 야 합 니 다.int*p;*p=NULL;의 차이 점:int*p=NULL 은 성형 변 수 를 가리 키 는 지침 을 정의 하고 이 지침 을 초기 화 하 며 초기 값 을 NULL 로 부여 합 니 다.int*p;성형 변 수 를 가리 키 는 지침 을 정의 합 니 다.이 지침 을 초기 화하 지 않 았 기 때문에 모든 값 을 가리 킬 수 있 습 니 다.따라서 시스템 메모리 의 변 수 를 가리 킬 수 있 습 니 다.그리고*p=NULL;p 가 가리 키 는 변수의 값 을 0 으로 하 는 것 입 니 다.p 가 가리 키 는 값 이 확실 하지 않 기 때문에 이 조작 은 매우 위험 합 니 다.(3)포인터 변수의 할당 에 주의해 야 할 문 제 는 기본 유형 이 같은 서로 다른 포인터 변수 간 에 할당 할 수 있다 는 것 을 알 고 있 습 니 다.서로 다른 기본 형식의 변 수 는 할당 할 수 없습니다.실행 코드:
if(!p)p=p1;
편집기 알림:강제 유형 전환 을 통 해 상기 할당 을 실현 할 수 있 습 니 다.
#include<iostream>
using namespace std;
int main(){
<span style="white-space:pre"> </span>int *p1,i=5;
<span style="white-space:pre"> </span>double *p2 ,j=2.5;
<span style="white-space:pre"> </span>p1=&i;
<span style="white-space:pre"> </span>p2=&j;
p1=p2;
cout<<*p1<<endl;
return 0;
}
상기 조작 은 더 이상 잘못 보고 하지 않 지만 포인터 의 강제 유형 전송 은 데 이 터 를 차단 하기 때문에 이상 적 인 결 과 를 얻 지 못 합 니 다.포인터 의 강제 형식 변환(4)포인터 변수 에 정수 추가/감소
예 를 들 어
#include<iostream>
using namespace std;
int main(){
int *p1,i=5;
double *p2 ,j=2.5;
p1=&i;
cout<<*p1<<endl;
p2=&j;
cout<<*p2<<endl;
p1=(int *)p2;
cout<<*p1<<endl;
return 0;
}
C++에 따 르 면 하나의 포인터 변 수 는 이 포인터 변수의 원래 값(원래 가리 키 는 주소)과 그 가 가리 키 는 변수 가 사용 하 는 메모리 셀 바이트 수 를 추가 하거나 감소 하 는 것 입 니 다.예 를 들 어 p+i;이러한 주소 계산 을 대표 합 니 다:p+i*d,d 는 p 가 가리 키 는 변수 단원 이 차지 하 는 바이트 수 입 니 다.이렇게 해야만 p+i 가 p 아래 의 i 번 째 요 소 를 가리 키 는 것 을 보증 할 수 있다.(5)두 포인터 변수 가 서로 줄 어 들 면 두 포인터 가 가리 키 는 같은 배열 의 요소 가 있 으 면 두 포인터 변수의 차 이 는 두 포인터 가 그 사이 의 요소 의 개수 로 변 하 는 것 이다.
p++;
p--;
p+i;
p-1;
p+=i;
p-=i;
실행 결과:(6)두 포인터 변 수 를 비교 하면 두 포인터 가 같은 배열 의 요 소 를 가리 키 면 크기 를 비교 할 수 있다.앞의 요 소 를 가리 키 는 포인터 변 수 는 뒤의 요 소 를 가리 키 는 포인터 변수 보다 작 습 니 다.
#include<iostream>
using namespace std;
int main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p1=&a[3];
int *p2=&a[5];
cout<<(p2-p1)<<endl;
cout<<(p1-p2)<<endl;
return 0;
}
결과 출력:또한 이 성질 을 이용 하여 배열 의 모든 요 소 를 출력 할 수 있 습 니 다.
#include<iostream>
using namespace std;
int main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p1=&a[3];
int *p2=&a[5];
if(p1<p2){
cout<<"p1<p2"<<endl;
}else{
cout<<"p1>=p2"<<endl;
}
return 0;
}
출력 결과:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
포인터 기반 데이터 형식 및 포인터 연산 소결int*p=NULL 도 주의해 야 합 니 다.int*p;*p=NULL;의 차이 점:int*p=NULL 은 성형 변 수 를 가리 키 는 지침 을 정의 하고 이 지침 을 초기 화 하 며 초기 값 을 NULL 로 부여 합...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.