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=”<

  }

  

좋은 웹페이지 즐겨찾기