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 급 간 주 소 를 넘 는 경 우 는 드물다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio에서 파일 폴더 구분 (포함 경로 설정)Visual Studio에서 c, cpp, h, hpp 파일을 폴더로 나누고 싶었습니까? 어쩌면 대부분의 사람들이 있다고 생각합니다. 처음에 파일이 만들어지는 장소는 프로젝트 파일 등과 같은 장소에 있기 때문에 파일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.