C++에서 포인터 의 데이터 형식 과 연산 에 관 한 지식 소결

6009 단어 C++포인터
C++포인터 의 데이터 형식 과 포인터 연산 에 관 한 소결
앞에서 이미 일부 포인터 연산(예 를 들 어 p+,p+i 등)을 사 용 했 는데,지금 은 모든 포인터 연산 을 아래 와 같이 열거 합 니 다.
1)포인터 변수 플러스/마이너스 정수
예 를 들 어 p++,p--,p+i,p+i,p-=i 등.
C++는 포인터 변수 에 정 수 를 추가 하거나 줄 이 는 것 은 이 포인터 변수의 원래 값(하나의 주소)과 가리 키 는 변수 가 사용 하 는 메모리 셀 바이트 수 를 추가 하거나 감소 하 는 것 이 라 고 규정 합 니 다.p+i 는 이러한 주소 계산 을 대표 합 니 다:p+i*d,d 는 p 가 가리 키 는 변수 단위 에서 사용 하 는 바이트 수 입 니 다.이렇게 해야만 p+i 가 p 아래 의 i 번 째 요 소 를 가리 키 는 것 을 보증 할 수 있다.
2)포인터 변수 할당
변수 주 소 를 포인터 변수 에 부여 합 니 다.예:

 p=&a; //   a     p
 p=array; //   array        p
 p=&array[i]; //   array i        p
 p=max; //max       , max       p
 p1=p2; //p1 p2          , p2    p1
3)포인터 변 수 는 빈 값 을 가 질 수 있 습 니 다.즉,이 포인터 변 수 는 변 수 를 가리 키 지 않 습 니 다.이렇게 표시 할 수 있 습 니 다.

 p=NULL;
실제로 NULL 은 정수 0,즉 p 가 주 소 를 0 으로 가리 키 는 단원 을 대표 합 니 다.이렇게 하면 바늘 이 어떤 효과 적 인 단원 도 가리 키 지 않 게 할 수 있다.실제 시스템 에서 NULL 을 먼저 정 의 했 습 니 다.

 #define NULL 0
iostream 헤더 파일 에는 이상 의 NULL 정의 가 포함 되 어 있 습 니 다.NULL 은 기호 상수 입 니 다.p 의 값 은 NULL 과 p 가 할당 되 지 않 은 것 과 같은 두 가지 개념 임 을 주의해 야 한다.
모든 포인터 변수 나 주 소 는 NULL 과 같 거나 같 지 않 은 비 교 를 할 수 있 습 니 다.예 를 들 어:

 if(p==NULL) p=p1;
4)두 포인터 변 수 는 상쇄 할 수 있다.
만약 에 두 포인터 변수 가 같은 배열 의 요 소 를 가리 키 면 두 포인터 변수 값 의 차 이 는 두 포인터 사이 의 요소 갯 수 이 고 그림 6.25 참조.
p1 이 a[1],p2 가 a[4]를 가리 키 면 p2-p1=(a+4)-(a+1)=4-1=3 이지 만 p1+p2 는 실제 적 인 의미 가 없다.
5)두 포인터 변수 비교
두 포인터 가 같은 배열 의 요 소 를 가리 키 면 비교 할 수 있다.앞의 요 소 를 가리 키 는 포인터 변 수 는 뒤의 요 소 를 가리 키 는 포인터 변수 보다 작 습 니 다.그림 6.25 에서 p1
6)포인터 변수 에 대한 할당 은 유형 문제 에 주의해 야 한다.
이 장 앞의 몇 절 에서 지침 의 기본 개념 과 초보적인 응용 을 소개 했다.지침 은 C 와 C++에서 중요 한 개념 으로 C 와 C++의 특색 임 을 설명해 야 한다.지침 을 사용 하 는 장점 은:
프로그램 효율 향상;
함 수 를 호출 할 때 호출 된 함수 중 일부 변수의 값 을 바 꾸 면 이 값 들 은 메 인 함수 에 사용 할 수 있 습 니 다.즉,함수 호출 을 통 해 여러 개의 변경 가능 한 값 을 얻 을 수 있 습 니 다.
동적 저장 소 분 배 를 실현 할 수 있다.
그러나 지침 의 사용 이 너무 유연 하고 숙련 된 프로그래머 에 게 는 특색 있 고 질 좋 은 프로그램 을 만들어 다른 고급 언어 로 는 실현 하기 어 려 운 기능 을 많이 실현 할 수 있 으 나 실 수 를 하기 쉽 고 이런 실 수 는 발견 하기 어렵다.
C++포인터 배열 과 포인터 포인터 포인터
포인터 배열 의 개념
만약 에 하나의 배열 이 라면 그 요 소 는 모두 포인터 형식 데이터 이 고 이 배열 은 포인터 배열 이 라 고 합 니 다.즉,포인터 배열 의 모든 요 소 는 하나의 포인터 변수 에 해당 하 며 그 값 은 모두 주소 입 니 다.1 차원 포인터 배열 의 정의 형식 은:
    형식 이름*배열 이름[배열 길이];
예 를 들 면:

 int *p[4];
포인터 배열 의 각 요소 로 여러 문자열 을 가리 키 며 문자열 처 리 를 더욱 편리 하고 유연 하 게 할 수 있 습 니 다.
【예】약간의 문자열 은 알파벳 순서(작은 것 에서 큰 것 까지)로 출력 합 니 다.

#include <iostream>
using namespace std;
int main( )
{
 void sort(char *name[],int n); //    
 void print(char *name[],int n); //    
 char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"}; //      
 int n=5;
 sort(name,n);
 print(name,n);
 return 0;
}
void sort(char *name[],int n)
{
 char *temp;
 int i,j,k;
 for(i=0;i<n-1;i++)
 {
  k=i;
  for(j=i+1;j<n;j++)
   if(strcmp(name[k],name[j])>0) k=j;
  if(k!=i)
  {
   temp=name[i];name[i]=name[k];name[k]=temp;
  }
 }
}
void print(char *name[],int n)
{
 int i;
 for(i=0;i<n;i++)
  cout<<name[i]<<endl;
}
실행 결 과 는:

BASIC
COBOL
C++
FORTRAN
Pascal


print 함수 의 역할 은 각 문자열 을 출력 하 는 것 입 니 다.name[0]~name[4]는 각각 문자열 의 첫 번 째 주소 입 니 다.print 함수 도 다음 과 같은 형식 으로 바 꿀 수 있 습 니 다.

void print(char *name[],int n)
{
 int i=0
 char *p;
 p=name[0];
 while(i<n)
 {
  p=*(name+i++);
  cout<<p<<endl;
 }
}
그 중에서'*(name+i++)'는 먼저*(name+i)의 값 을 구 하 는 것 을 나타 낸다.즉,name[i](이것 은 주소 이다).그것 을 p 에 부여 하고 i 에 1 을 추가 합 니 다.마지막 으로 p 주소 로 시작 하 는 문자열 을 출력 합 니 다.
지침
지침 배열 의 개념 을 파악 한 토대 에서 지침 데 이 터 를 가리 키 는 지침 을 소개 하 며 지침 을 가리 키 는 지침 이 라 고 부른다.그림 6.22 에서 볼 수 있 듯 이 name 은 포인터 배열 입 니 다.모든 요 소 는 포인터 데이터(그 값 은 주소)로 서로 다른 문자열 을 가리 키 고 있 습 니 다.배열 이름 name 은 이 포인터 배열 의 첫 번 째 요소 의 주 소 를 대표 합 니 다.name+i 는 name[i]의 주소 입 니 다.name[i]의 값 은 주소(즉 지침)이기 때문에 name+i 는 지침 형 데 이 터 를 가리 키 는 지침 입 니 다.포인터 변수 p 를 설정 할 수 있 습 니 다.포인터 배열 의 요 소 를 가리 키 고 있 습 니 다(그림 참조).p 는 포인터 형 데 이 터 를 가리 키 는 포인터 변수 입 니 다.

어떻게 포인터 데 이 터 를 가리 키 는 포인터 변 수 를 정의 합 니까?다음 과 같다.

 char *(*p);
부록 B 에서 알 수 있 듯 이*연산 자의 결합 성 은 오른쪽 에서 왼쪽으로 이 므 로'char*(*p)';쓰기 가능:

 char **p;
[예]문자 형 데 이 터 를 가리 키 는 포인터 변수 입 니 다.

#include <iostream>
using namespace std;
int main( )
{
 char **p; //               p
 char *name[]={"BASIC","FORTRAN","C++","Pascal","COBOL"};
 p=name+2; //  6.23 p   
 cout<<*p<<endl; //  name[2]      
 cout<<**p<<endl; //  name[2]             
}
실행 결 과 는:

C++
C
포인터 배열 의 요 소 는 문자열 을 가리 키 지 않 고 정형 데이터 나 단일 정밀도 데이터 등 을 가리 킬 수 있 습 니 다.
이 장 첫머리 에'간접 접근'변수의 방식 이 언급 되 었 다.포인터 변 수 를 이용 하여 다른 변 수 를 방문 하 는 것 이 바로'간접 접근'입 니 다.포인터 변수 에 대상 변수의 주 소 를 저장 하면 이것 이 바로'단일 주소'입 니 다.그림 6.24(a)참조.지침 을 가리 키 는 지침 은'2 급 주소'방법 을 사용한다.다음 그림 을 보십시오.이론 적 으로 볼 때 간 주소 방법 은 더 많은 단계 로 확대 할 수 있 고 다음 그림 을 볼 수 있다.그러나 실제로 프로그램 에 서 는 2 급 간 주 소 를 넘 는 경 우 는 드물다.

좋은 웹페이지 즐겨찾기