C언어 포인터와 배열
메모리에 직접 접근하고 제어하는 메모리의 주소 : 포인터
포인터의 형변환
- C언어에서는 꼭 필요한 경우에, 명시적으로 포인터의 타입을 변경할 수 있다.
- 포인터의 타입과 변수의 타입은 일치하여야 한다.
double d;
double *pd = %d;
int *pi;
pi = (int*)pd; // 캐스트 연산자를 사용하여 정수형 포인터로 변환
[실습] 간접 참조 연산자와 포인터 연산
#include <stdio.h>
int main(){
char buffer[8];
double *pd;
int *pi;
pd = (double*)buffer;
*pd = 3.14;
printf("%f\n", *pd);
pi = (int*)buffer;
*pi = 123;
*(pi+1) = 456;
printf("%d %d\n", *pi, *(pi+1));
return 0;
}
포인터와 배열
- 배열과 포인터는 아주 밀접한 관계를 가지고 있다.
- 배열 이름이 바로 포인터이다.
- 포인터는 배열처럼 사용이 가능하다.
- *p=a[]={0,1,2,3,4,5,6,7,8}
[실습] 포인터와 배열
//포인터와 배열의 관계
#include <stdio.h>
int main(){
int a[]={10,20,30,40,50}; //배열명 : 포인터 상수
printf(“a=%u\n”, a); //a의 주소값
printf(“a+1=%u\n”, a+1); //포인터 연산
printf(“*a=%d\n”, *a); //a가 가르키는 것, 간접참조연산자
printf(“*(a+1)=%d\n”, *(a+1)); //int형 4byte뒤의 값. a[1]=*(a+1), a[i]=*(a+i)
return 0;
}
포인터와 배열
- 포인터는 배열처럼 사용할 수 있다.
- 인덱스 표기법을 포인터에 사용할 수 있다.
[실습] 포인터를 배열처럼 사용
#include <stdio.h>
int main(){
int a[] = {10,20,30,40,50};
int *p;
p = a;
printf(“a[0]=%d a[1]=%d a[2]=%d\n”, a[0], a[1], a[2]);
printf(“p[0]=%d p[1]=%d p[2]=%d\n”, p[0], p[1], p[2]);
//배열은 결국 포인터로 구현된다는 것을 알 수 있다.
p[0] = 60;
p[1] = 70;
p[3] = 80;
printf(“a[0]=%d a[1]=%d a[2]=%d\n”, a[0], a[1], a[2]);
printf(“p[0]=%d p[1]=%d p[2]=%d\n”, p[0], p[1], p[2]);
return 0;
}
포인터를 사용한 방법의 장점
- 포인터가 인덱스 표기법보다 빠르다.
- why? 인덱스를 주소로 변환할 필요가 없기 때문에 속도가 더 빠르다.
[실습] 배열의 원소를 역순으로 출력
#include <stdio.h>
void print_reverse(int a[], int n);
int main(){
int a[] = {10,20,30,40,50};
print_reverse(a,5); // 함수 호출
return 0;
}
void print_reverse(int b[], int n){
int *p = b+n-1; // 마지막 노드를 가리킨다.
while(p>=b) // 첫번째 노드까지 반복
printf(“%d\n”, *p — ); // p가 가리키는 위치를 출력하고 감소
}
scanf함수
변수의 값을 저장하기 위해 변수의 주소를 받는다.