c / c + + 의 포인터 응용 및 주의 문제
3928 단어 c + +
핵심 알림:
지침 은 c / c + + 학습 이 비교적 골 치 아 픈 문제 로 프로그램 설계 과정 에서 지침 도 흔히 bug 를 포함 하 는 원인 이 된다.다음은 지침 의 응용 과 주의해 야 할 몇 가지 문 제 를 이야기 하 겠 습 니 다. 그 안에 당신 이 평소에 주의 하지 못 했 던 문제 가 있 을 수 있 습 니 다. 여러분 의 독자 들 이 지침 을 잘 이해 하도록 도와 주 기 를 바 랍 니 다.
1. 우리 먼저 지침 의 개념 을 회상 해 봅 시다. 아래 의 소개 에 편리 합 니 다.
포인터 는 주소 값 을 저장 하 는 변수 나 상수 입 니 다.
예 를 들 어 int a = 1; &a 는 포인터 상수 ("&" 는 주소 연산 자, 즉 참조) 를 나타 낸다.
int * b, b 는 포인터 변 수 를 표시 합 니 다.
모두 주의:
int * b [2] 와 int (* b) [2] 는 다 릅 니 다. int * b 는 하나의 지침 배열 을 표시 하고 int (* b) [2] 는 두 가지 요 소 를 포함 한 int 지침 을 표시 합 니 다. 여 기 는 연산 우선 순위 문 제 를 주의 하여 지침 문 제 를 이해 하 는 데 도움 이 됩 니 다.
여기 서 기본 개념 을 대충 소개 하면 됩 니 다. 구체 적 인 사용 방법, 예 를 들 어 할당 등 많은 책 들 이 소개 되 어 있 기 때문에 저 는 더 이상 말 하지 않 겠 습 니 다.
2. 응용 및 주의 하 는 문제
1. 포인터 의 관건 을 이해 하 는 것 - 포인터 유형 과 포인터 가 가리 키 는 유형 에 대한 이해
① 포인터 유형: 포인터 이름 을 지 울 수 있 고 나머지 는 이 포인터 이다.
예: int * a; /포인터 형식 은 int *
int **a;//포인터 형식 은 int * *
int *(*a)[8];//포인터 형식 은 int * (*) [8]
② 포인터 가 가리 키 는 유형: 컴 파일 러 가 그 메모 리 를 바라 보 는 유형 을 말한다.여기 포인터 성명 문 에 있 는 포인터 이름과 이름 오른쪽 만 있 으 면 됩 니 다. 의 '*' 번 호 를 빼 면 되 고 나머지 는 포인터 가 가리 키 는 유형 입 니 다.
내 가 그들 을 첫 번 째 로 생각 하 는 이 유 는 그들 이 c / c + 지침 을 배 우 는 중점 이라는 것 을 알 고 그들 을 정확하게 이해 해 야 c / c + 의 프로 그래 밍 기 초 를 다 질 수 있 기 때문이다.
2. 포인터 의 응용 - 전달 매개 변수.
사실 그것 은 암시 적 인 반환 값 에 해당 할 수 있 습 니 다. 이것 은 return 의 방법 보다 더욱 유연 하고 더 많은 것 을 되 돌 릴 수 있 습 니 다.
의 값 은 아래 의 예 를 보면 자연히 알 수 있다.
#include "iostream.h"
void example(int *a1,int &b1,int c1)
{
*a1*=3;
++b1;
++c1;
}
void main()
{
int *a;
int b,c;
*a=6;
b=7;c=10;
example(a,b,c);
cout 《"*a="《*a<
cout 《"b="<
cout 《"c="<
}
출력: * a = 18
b=8
c=10
주의 하 시 겠 습 니까? * a 와 b 의 값 은 모두 바 뀌 었 고 c 는 변 하지 않 았 습 니 다.이것 은 a1 이 * a (= 6) 를 가리 키 는 지침 이기 때 문 입 니 다.
즉, a 와 같은 주 소 를 가리 키 기 때문에 a1 이 가리 키 는 값 이 바 뀌 면 * a 의 값 도 달라 집 니 다.함수
의 매개 변 수 는 인용 (int & b1) 을 사 용 했 고 b1 은 b 의 별명 이 며 특수 한 지침 으로 이해 할 수 있 습 니 다.
b 의 값 으로 변 합 니 다.함수 중의 인자 int c1 은 함수 에서 만 작용 하고 함수 가 끝 날 때 사라 집 니 다.
그래서 main () 에 서 는 소 용이 없습니다.
3. 전역 변수 와 부분 변수 에 대한 문제
우선 쓸데없는 말 은 하지 말고 먼저 절 차 를 살 펴 보 자.
#include “iostream.h”
int a=5;
int *example1(int b)
{
a+=b;
return &a;
}
int *example2(int b)
{
int c=5;
b+=c;
return &b;
}
void main()
{
int *a1=example1(10);
int *b1=example2(10);
cout <
출력 결과:
a1=15
b1=4135
* b1 이 어떻게 4135 일 수 있 습 니까? 15 가 아 닙 니 다.절차 가 문제 야?맞 죠?
a 는 전역 변수 이기 때문에 전역 변수의 메모리 에 저 장 됩 니 다. 이것 은 항상 존재 합 니 다.부분 변 수 는 저장
함수 스 택 에 있 습 니 다. 함수 example 2 () 호출 이 끝 난 후에 사라 집 니 다. b 가 불확실 한 영역 을 가리 키 고 있 습 니 다.
지침 이 걸리다.
다음은 example 1 () 과 example 2 () 에 대한 어 셈 블 리 (TC + 3.0 으로 컴 파일) 입 니 다.
example1():
push bp;창고 에 넣다
mov bp,sp
mov ax,[bp+04];전달 매개 변수
add [00AA],ax;더 하 다
mov ax,00AA ;결과 가 있 는 주 소 를 되 돌려 주 었 습 니 다.
pop bp;복구 창고
ret;종료 함수
example2():
push bp;창고 에 넣다
mov bp,sp
sub sp,02
mov word ptr [bp-02],0005
mov ax,[bp-02];전달 매개 변수
add [bp+04],ax;더 하 다
lea ax,[bp+04];문 제 는 바로 여기에 있다.
mov sp,bp
pop bp;복구 창고
ret;종료 함수
비교 해 보니까 알 겠 죠?x 는 결과 의 주 소 를 저장 해 야 합 니 다.example 2 () 에서 되 돌려 줍 니 다.
[bp + 04] 의 내용 이기 때문에 지침 은 불확실 한 곳 을 가리 키 고 이 로 인해 발생 하 는 지침 이 걸 려 있 습 니 다.exa
mple 1 () 에서 x 는 정확 한 결과 의 주 소 를 되 돌려 주 었 습 니 다.
4. 메모리 문제: 포인터 로 메모리 의 배분 과 경 계 를 주의 합 니 다.
지침 을 사용 하 는 과정 에서 보이 지 않 는 오류 가 발생 하지 않도록 변수 에 적당 한 공간 을 주어 야 한다.
다음 코드 를 보십시오.
#include “iostream.h”
void main()
{
char *a1;
char *a2;
cin 》a1;
cin 》a2;
cout 《”a1=”<
cout 《”a2=”<
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.