c언어 기초

포인터

달달고냥 2017. 4. 1. 17:29

1. 포인터란? - 주소값을 저장하는 변수

포인터란 메모리의 번지 주소이다.

포인터 변수는 메모리의 주소를 가지는 변수이다.

포인터 변수의 크기는 4byte의 부호없는 정수형이다.

포인터는 첫번째 바이트의 주소값만 저장

포인터 변수 출력은 %p를 이용 


포인터 연산자

&는 변수의 메모리 주소를 출력하는 연산자이다.

*는 주소를 이용하여 변수값을 접근하는 연산자이다.


간접참조 연산자(역 참조 연산자)

* : 피연산자의 메모리에 접근하라는 뜻

즉 메모리에 접근해서 주소값을 저장해 가는 변수! 변수처럼 값을 저장하기 위한것! 


int *p // 메모리에 접근가능한 변수가 됨

p = &num //포인터가 변수 num 주소값을 저장함

*p = 123 // 변수 num에 123을 대입


int *ptr1 = &num1 // 선언과 동시에 초기화 

char *ptr2 = &num2 // 선언과 동시에 초기화 

double *ptr3 = &num3 // 선언과 동시에 초기화 


- 포인터형으로 데이터를 출력할때 서식문자 %p를 통해 주소값을 쉽게 표현 할 수있다.

printf("num1의 저장위치 : %p \n",ptr1);
printf("num2의 저장위치 : %p \n",ptr2);
printf("num3의 저장위치 : %p \n",ptr3);

- %#x 는 맨 앞에 0x로 출력, %p 로 하면 맨앞에 00으로 출력되여 결과가 약간 다름




Call by Reference




포인터에서 캐스팅 연산자 () 


int i;

double *ptr = &i;  // int형 변수의 주소값을 double형 포인터가 저장하는데, &i 주소값이 더블형으로 변환

이럴때 강제형 변환은 캐스팅 연산자 () 를 이용


int i;

double *ptr = (double *)&i; 




포인터 연산


1. *ptr++ 

=> 순서 ① * 간접참조를 한다.

            ② ++ 후위 증가를 한다. 


#include<stdio.h>

int main() {

int arr[] = {10,20,30,40,50};

int arrlen = sizeof(arr) / sizeof(int);

int i, *ptr;


ptr = arr;


for (i = 0; i < arrlen; i++)

printf("%d \n", *ptr++);


getch();

return 0;

}

 결과 

10

20

30

40

50



#include<stdio.h>

int main() {

int arr[] = {10,20,30,40,50};

int *ptr = arr; 

int sum = 0;


while (*ptr)

sum += *ptr++;


printf("배열 arr 요소들의 합 : %d ", sum);


getch();

return 0;

 결과




#include <stdio.h>

int main(void) { int a = 100; char b = 'M'; double d = 1.34; int* ap = &a; // ap = &b; 경고 발생 puts(" \n void 포인터(pointer) \n"); printf(" a = %3d, &a = %d \n", a, &a ); printf(" b = %3c, &b = %d \n", b, &b ); printf(" d = %.1f, &d = %d \n", d, &d ); printf(" *ap = %3d, ap = %d, &ap = %d \n\n", *ap, ap, &ap); return 0; }

 결과 

a=100, &a=6487724

b= M, &b=6487728

d=1.3, &c=6487732

*ap=100, ap=6487724, &ap=6487708