C 언어 포인터 변수 상세 설명

데이터 가 메모리 에 있 는 주 소 를 포인터 라 고도 부 릅 니 다.만약 변수 가 데이터 의 지침 을 저장 했다 면 우 리 는 그것 을 포인터 변수 라 고 부 릅 니 다.
C 언어 에 서 는 포인터 변 수 를 하나의 변수 로 저장 할 수 있 습 니 다.이 변 수 를 포인터 변수 라 고 합 니 다.포인터 변수의 값 은 특정한 데이터 의 주소 입 니 다.이러한 데 이 터 는 배열,문자열,함수 일 수도 있 고 다른 일반 변수 나 포인터 변수 일 수도 있 습 니 다.
현재 char 형식의 변수 c 가 있다 고 가정 하면 문자'K'(ASCII 코드 는 10 진수 75)를 저장 하고 주 소 를 0 X11A 로 표시 하 는 메모리(주 소 는 보통 16 진법 으로 표시)를 차지 합 니 다.또 하나의 포인터 변수 p 가 있 는데 그 값 은 0 X11A 이 고 변수 c 의 주소 와 같 습 니 다.이런 상황 에서 우 리 는 p 가 c 를 가리 키 거나 p 는 변수 c 를 가리 키 는 지침 이 라 고 부 릅 니 다.

포인터 변수 정의
정의 포인터 변 수 는 일반 변 수 를 정의 하 는 것 과 매우 유사 하지만 변수 이름 앞 에 별표*를 추가 해 야 합 니 다.형식 은:
datatype *name;
혹은
datatype *name = value;
*이것 은 포인터 변수 임 을 표시 합 니 다.datatype 은 이 포인터 변수 가 가리 키 는 데이터 의 유형 을 표시 합 니 다.예 를 들 면:
int *p1;
p1 은 int 형식 데 이 터 를 가리 키 는 포인터 변수 입 니 다.p1 이 어떤 데 이 터 를 가리 키 는 지 는 부 여 된 값 에 의 해 결정 되 어야 합 니 다.또한:
int a = 100;
int *p_a = &a;
포인터 변 수 를 정의 합 니 다 pa 와 동시에 초기 화하 고 변수 a 의 주 소 를 부여 합 니 다.이때 pa 는 a 를 가 리 켰 다.주의해 야 할 것 은 pa.필요 한 주소 입 니 다.a 앞 에 주소 부 호 를 추가 해 야 합 니 다.그렇지 않 으 면 잘못 되 었 습 니 다.
일반 변수 와 마찬가지 로 포인터 변 수 는 여러 번 기록 할 수 있 습 니 다.원 하 시 면 언제든지 포인터 변수의 값 을 바 꿀 수 있 습 니 다.아래 코드 를 보 세 요.

//      
float a = 99.5, b = 10.6;
char c = '@', d = '#';
//      
float *p1 = &a;
char *p2 = &c;
//        
p1 = &b;
p2 = &d;
*변 수 는 포인터 변수 임 을 나타 내 는 특수 기호 로 p1,p2 를 정의 할 때 반드시*를 가 져 야 합 니 다.p1,p2 에 값 을 부여 할 때 포인터 변수 라 는 것 을 알 았 기 때문에 더 이상*를 가 져 갈 필요 가 없습니다.뒤쪽 은 일반 변 수 를 사용 하 는 것 처럼 포인터 변 수 를 사용 할 수 있 습 니 다.즉,포인터 변 수 를 정의 할 때*를 가 져 가 야 하고 포인터 변수 에 값 을 부여 할 때*를 가 져 갈 수 없습니다.
가설 변수 a,b,c,d 의 주 소 는 각각 0X 1000,0X 1004,0X 2000,0X 2004 이 고 아래 의 설명도 가 p1,p2 가 가리 키 는 변 화 를 잘 나 타 냈 다.

강조해 야 할 것 은 p1,p2 의 유형 은 각각 float*와 char*이지 float 와 char 가 아니 라 완전히 다른 데이터 유형 이 므 로 독자 들 은 주 의 를 끌 어야 한다.
포인터 변수 도 연속 으로 정의 할 수 있 습 니 다.예 를 들 어:
int *a, *b, *c;  //a,b,c 의 유형 은 모두 int*이다.
모든 변수 앞 에*를 가 져 가 야 합 니 다.다음 형식 으로 쓰 면 a 만 포인터 변수 이 고 b,c 는 모두 int 형식의 일반 변수 입 니 다.
int *a, b, c;
포인터 변 수 를 통 해 데 이 터 를 얻 습 니 다.
포인터 변 수 는 데이터 의 주 소 를 저장 합 니 다.포인터 변 수 를 통 해 이 주소 의 데 이 터 를 얻 을 수 있 습 니 다.형식 은 다음 과 같 습 니 다.
*pointer;
여기*는 포인터 연산 자 라 고 합 니 다.어떤 주소 의 데 이 터 를 얻 을 수 있 습 니 다.아래 의 예 를 보십시오.

#include <stdio.h>
int main(){
 int a = 15;
 int *p = &a;
 printf("%d, %d
", a, *p); // a return 0; }
실행 결과:
15, 15
a 의 주소 가 0x 1000 이 라 고 가정 하면 p 가 a 를 가리 키 면 p 자체 의 값 도 0x 1000 으로 변 합 니 다.*p 는 주소 0x 1000 의 데 이 터 를 가 져 오 는 것,즉 변수 a 의 값 을 표시 합 니 다.운행 결 과 를 보면*p 와 a 는 등가 입 니 다.
앞에서 말 했 듯 이 CPU 읽 기와 쓰기 데 이 터 는 메모리 에 있 는 데이터 의 주 소 를 알 아야 합 니 다.일반 변수 와 포인터 변 수 는 모두 주소 의 보조 기호 입 니 다.*p 와 a 를 통 해 얻 은 데이터 와 같 지만 그들의 운행 과정 은 조금 다 릅 니 다.a 는 한 번 의 연산 만 하면 데 이 터 를 얻 을 수 있 고*p 는 두 번 의 연산 을 거 쳐'간접'이 많아 집 니 다.
변수 a,p 의 주 소 는 각각 0X 1000,0XF0A0 이 라 고 가정 하고 그들의 지향 관 계 는 다음 그림 과 같다.
프로그램 이 컴 파일 되 고 링크 되면 a,p 는 해당 주소 로 대 체 됩 니 다.*p 를 사용 하려 면 먼저 주소 0xF0A 0 을 통 해 변수 p 자체 의 값 을 얻어 야 합 니 다.이 값 은 변수 a 의 주소 이 고 이 값 을 통 해 변수 a 의 데 이 터 를 얻어 야 합 니 다.앞 뒤 는 모두 두 번 의 연산 이 있 습 니 다.a 를 사용 하면 주소 0x 1000 을 통 해 데 이 터 를 직접 얻 을 수 있 고 한 단계 의 연산 만 필요 합 니 다.
지침 을 사용 하 는 것 은 간접 적 으로 데 이 터 를 얻 는 것 이 고 변수 명 을 사용 하 는 것 은 데 이 터 를 직접 얻 는 것 이 며 전 자 는 후자 보다 대가 가 높다 는 것 이다.
포인터 는 메모리 의 데 이 터 를 가 져 올 수 있 을 뿐만 아니 라 메모리 의 데 이 터 를 수정 할 수 있 습 니 다.예 를 들 어:

#include <stdio.h>
int main(){
 int a = 15, b = 99, c = 222;
 int *p = &a; //      
 *p = b; //              
 c = *p; //              
 printf("%d, %d, %d, %d
", a, b, c, *p); return 0; }
실행 결과:
99, 99, 99, 99
*p 는 a 의 데 이 터 를 대표 합 니 다.a 와 같 습 니 다.다른 데 이 터 를 할당 할 수도 있 고 다른 변수 에 할당 할 수도 있 습 니 다.
*서로 다른 장면 에서 서로 다른 역할 을 합 니 다.*포인터 변수의 정의 에 사용 할 수 있 습 니 다.이것 은 포인터 변수 임 을 나타 내 고 일반 변수 와 분리 할 수 있 습 니 다.포인터 변 수 를 사용 할 때 앞 에*를 추가 하면 포인터 가 가리 키 는 데 이 터 를 가 져 오 거나 포인터 가 가리 키 는 데이터 자 체 를 나타 낸다.
즉,포인터 변 수 를 정의 할 때의*와 포인터 변 수 를 사용 할 때의*의 미 는 완전히 다르다.다음 문장 을 예 로 들 면:
int *p = &a;
*p = 100;
첫 번 째 줄 코드 에서*p 는 포인터 변수 이 고 두 번 째 줄 코드 에서*포인터 가 가리 키 는 데 이 터 를 가 져 옵 니 다.
주의해 야 할 것 은 포인터 변수 자체 에 값 을 부여 할 때*를 추가 할 수 없습니다.위의 문장 수정:
int *p;
p = &a;
*p = 100;
두 번 째 줄 코드 중의 p 앞 에*를 추가 할 수 없습니다.
포인터 변 수 는 일반 변수 가 나타 날 수 있 는 모든 표현 식 에 도 나타 날 수 있 습 니 다.예 를 들 어:

int x, y, *px = &x, *py = &y;
y = *px + 5; //   x    5   y,*px+5   (*px)+5
y = ++*px; //px     1    y,++*px   ++(*px)
y = *px++; //   y=(*px)++
py = px; //              
[예제]포인터 로 두 변수의 값 을 교환 합 니 다.

#include <stdio.h>
int main(){
 int a = 100, b = 999, temp;
 int *pa = &a, *pb = &b;
 printf("a=%d, b=%d
", a, b); /***** *****/ temp = *pa; // a *pa = *pb; // b a *pb = temp; // a b /***** *****/ printf("a=%d, b=%d
", a, b); return 0; }
실행 결과:
a=100, b=999
a=999, b=100
운행 결 과 를 보면 a,b 의 값 이 이미 교환 되 었 음 을 알 수 있다.주의해 야 할 것 은 임시 변수 temp 입 니 다.그 역할 은 특히 중요 합 니 다.*pa=*pb 를 실행 하기 때 문 입 니 다.문장 뒤에 a 의 값 은 b 의 값 으로 덮어 씁 니 다.a 의 값 을 저장 하지 않 으 면 찾 을 수 없습니다.
*와&에 관 한 수수께끼
int 형식의 변수 a 가 있다 고 가정 하면 pa 는 그 지침 을 가리 키 는 것 입 니 다.그러면*&a 와&*pa 는 각각 무슨 뜻 입 니까?
*&a 는*(&a)로 이해 할 수 있 습 니 다.
&*pa 는&(*pa)로 이해 할 수 있 습 니 다.*pa 는 pa 가 가리 키 는 데이터(등가 a)를 얻 었 음 을 나타 내 고&(*pa)는 데이터 의 주소(등가&a)를 나타 내 므 로&*pa 는 pa 등가 입 니 다.
별표*에 대한 총화
우리 가 현재 배 운 문법 에서 별표*는 주로 세 가지 용도 가 있다.
  • 은 곱셈 을 나타 낸다.예 를 들 어 int a=3,b=5,c.  c = a * b;,이것 은 가장 이해 하기 쉬 운 것 이다.
  • 은 포인터 변 수 를 정의 하고 일반 변수 와 구분 하 는 것 을 나타 낸다.예 를 들 어 int a=100;  int *p = &a;。
  • 은 포인터 가 가리 키 는 데 이 터 를 얻 는 것 을 나타 내 는데 간접 적 인 조작 이다.예 를 들 어 int a,b,*p=&a;  *p = 100;  b = *p;。
  • 이상 C 언어 포인터 변수의 자 료 를 정리 하고 관련 자 료 를 계속 보충 합 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기