포인터 기반 데이터 형식 및 포인터 연산 소결

1.포인터 의 데이터 형식 소결 포인터 의 데이터 형식
정의.
속뜻
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;
}
출력 결과:

좋은 웹페이지 즐겨찾기