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 등가 입 니 다.
별표*에 대한 총화
우리 가 현재 배 운 문법 에서 별표*는 주로 세 가지 용도 가 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.