C 언어 포인터 변수의 연산 에 대한 상세 한 설명

포인터 변 수 는 주소 로 저장 되 어 있 으 며 본질 적 으로 하나의 정수 로 일부 연산 을 할 수 있 습 니 다.예 를 들 어 덧셈,뺄셈,비교 등 은 아래 의 코드 를 보 세 요.

#include <stdio.h>
int main(){
  int  a = 10,  *pa = &a, *paa = &a;
  double b = 99.9, *pb = &b;
  char  c = '@', *pc = &c;
  //    
  printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X
", &a, pa, pb, pc); // pa++; pb++; pc++; printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X
", &a, pa, pb, pc); // pa -= 2; pb -= 2; pc -= 2; printf("&a=%#X, pa=%#X, pb=%#X, pc=%#X
", &a, pa, pb, pc); // if(pa == paa){ printf("%d
", *paa); }else{ printf("%d
", *pa); } return 0; }
실행 결과:
&a=0X28FF44, pa=0X28FF44, pb=0X28FF30, pc=0X28FF2B
&a=0X28FF44, pa=0X28FF48, pb=0X28FF38, pc=0X28FF2C
&a=0X28FF44, pa=0X28FF40, pb=0X28FF28, pc=0X28FF2A
2686784
연산 결 과 를 통 해 알 수 있 듯 이 pa,pb,pc 는 매번 1 을 추가 하고 그들의 주 소 는 각각 4,8,1 을 증가 하 며 int,double,char 유형의 길이 이다.2 를 줄 일 때 주 소 는 각각 8,16,2 로 줄 어 들 었 고 int,double,char 유형의 길이 의 2 배 에 달 했다.
이것 은 매우 이상 하 다.포인터 변수 가감 연산 의 결 과 는 데이터 형식의 길이 와 관계 가 있 는데,간단하게 1 을 추가 하거나 1 을 줄 이 는 것 이 아니 라,이것 은 왜 일 까?
a 와 pa 를 예 로 들 면 a 의 유형 은 int 이 고 4 개의 바이트 를 차지한다.pa 는 a 를 가리 키 는 지침 이다.다음 그림 과 같다.

처음에 pa 는 a 의 시작 을 가리 키 고*pa 를 통 해 데 이 터 를 읽 을 때 pa 가 가리 키 는 위치 에서 4 개의 바이트 를 뒤로 이동 하여 이 4 개의 바이트 의 내용 을 가 져 올 데이터 로 합 니 다.이 4 개의 바이트 도 변수 a 가 사용 하 는 메모리 입 니 다.
하면,만약,만약...주 소 를 1 로 추가 하면 다음 그림 과 같은 지향 관계 가 됩 니 다.

이때 pa 는 정수 a 의 중간 을 가리킨다.*pa 는 빨간색 점선 으로 그 려 진 4 개의 바이트 를 사용한다.그 중에서 앞의 3 개 는 변수 a 의 것 이 고 뒤의 1 개 는 다른 데이터 이다.이 를'섞 어'는 것 은 실제 적 인 의미 가 없고 얻 은 데이터 도 매우 이상 할 것 이다.
하면,만약,만약...주 소 를 4 로 추가 하면 정수 a 를 완전히 뛰 어 넘 을 수 있 습 니 다.다음 그림 과 같 습 니 다.

우 리 는 배열 에 있 는 모든 요소 가 메모리 에 연속 적 으로 배열 되 어 있다 는 것 을 알 고 있다.만약 에 하나의 지침 이 배열 에 있 는 특정한 요 소 를 가리 키 면 1 을 더 하면 다음 요 소 를 가리 키 고 1 을 줄 이면 이전 요 소 를 가리 키 는 것 을 나타 낸다.그러면 지침 의 가감 연산 은 현실 적 인 의 미 를 가진다.우 리 는 라 는 절 에서 깊이 연구 할 것 이다.
그러나 C 언어 는 변수의 저장 방식 을 규정 하지 않 았 다.만약 에 여러 개의 변 수 를 연속 으로 정의 하면 그들 은 붙 어 있 을 수도 있 고 분 산 될 수도 있다.이것 은 변수의 유형,컴 파일 러 의 실현 과 구체 적 인 컴 파일 모델 에 달 려 있 기 때문에 일반 변 수 를 가리 키 는 지침 에 대해 우 리 는 가감 연산 을 하지 않 는 다.비록 컴 파일 러 가 잘못 보고 하지 않 지만.그러나 이렇게 하 는 것 은 의미 가 없다.왜냐하면 그 뒤에 가리 키 는 데이터 가 무엇 인지 모 르 기 때문이다.
아래 의 예 는 부정적인 교재 로 독자 에 게 지침 을 통 해 다음 변수의 주 소 를 가 져 오지 말 라 고 경고 합 니 다.

#include <stdio.h>
int main(){
  int a = 1, b = 2, c = 3;
  int *p = &c;
  int i;
  for(i=0; i<8; i++){
    printf("%d, ", *(p+i) );
  }
  return 0;
}
VS 2010 Debug 모드 에서 의 실행 결 과 는 다음 과 같 습 니 다.
3, -858993460, -858993460, 2, -858993460, -858993460, 1, -858993460,
변수 a,b,c 가 붙 어 있 지 않 고 중간 에 다른 보조 데이터 도 섞 여 있 음 을 알 수 있다.
포인터 변 수 는 가감 연산 에 참여 할 수 있 을 뿐만 아니 라 비교 연산 에 도 참여 할 수 있다.포인터 변 수 를 비교 연산 할 때 포인터 변수 자체 의 값,즉 데이터 의 주 소 를 비교 합 니 다.주소 가 같 으 면 두 바늘 은 같은 데 이 터 를 가리 키 고 그렇지 않 으 면 다른 데 이 터 를 가리킨다.
위의 코드(첫 번 째 예)는 pa 와 paa 의 값 을 비교 할 때 pa 는 a 의 이전 데 이 터 를 가리 키 기 때문에 같 지 않 습 니 다.한편,a 의 이전 데 이 터 는 무엇 인지 모 르 기 때문에 printf()가 의미 없 는 수 를 출력 할 수 있 습 니 다.이것 은 위의 관점 을 입증 하고 일반 변 수 를 가리 키 는 지침 에 대해 가감 연산 을 하지 마 십시오.
또한 지침 변 수 를 곱셈,나눗셈,나머지 등 다른 연산 을 할 수 없고 문법 오류 가 발생 할 뿐만 아니 라 실제 적 인 의미 도 없다 는 것 을 설명 해 야 한다.
이상 은 C 언어의 포인터 변수 연산 에 대한 상세 한 자료 정리 입 니 다.추 후 관련 자 료 를 계속 보충 하 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기