삽질의 현장/- C

[Surro] :: C언어 이론 07. 포인터

shovelman 2013. 10. 6. 22:21

7.포인터

-포인터란? : 메모리의 주소 값을 저장하기 위한 변수

: 포인터의 변수의 크기는 4바이트 (컴퓨터의 주소체계가 4바이트로 표현된다는 것을 의미)

: * 연산자를 사용하여 포인터를 선언

: 포인터의 타입은 메모리를 참조하는 방법을 알려주는 역할을 한다

+ &연산자 : 주소값을 참조할 때 사용한다

ex)

int main(void)

{

int a = 2005;

int* pA = &a;

.......

}

+ *연산자 : 포인터가 가리키는 메모리 참조

ex)

int main(void)

{

int a = 2005;

int* pA = &a;

printf("%d",pA);

printf("%d",*pA); // 2005출력

.......

}

 

ex)

#include<stdio.h>

 

int main(void)

{

int a = 2005;

int* pA = &a;

 

printf("pA : %d \n",pA);

printf("&a : %d \n",&a);

 

(*pA)++;

 

printf("a: %d \n",a);

printf("*pA: %d \n",*pA);

 

return 0;

}

 

>포인터 배열

:배열 이름은 첫 번째 요소의 주소 값을 나타낸다

:포인터와 배열의 차이점 = 포인터는 변수, 배열의 이름은 상수

ex)

#include<stdio.h>

 

int main(void)

{

int arr[3] = {0, 1, 2};

int *ptr;

 

ptr = arr;

 

printf("%d, %d, %d \n",ptr[0],ptr[1],ptr[2]);

 

:널 포인터 = 아무것도 가리키지 않는다는 의미

 

>문자열 배열

ex)

#include<stdio.h>

{

char* arr[3] = {

"Fervent-lecture",

"TCP/IP",

"Socket Programing"

};

 

printf("%s \n",arr

return 0;

}

>더블 포인터

:싱클 포인터를 가리킨다.

ex)

#include<stdio.h>

 

int main(void)

{

double val = 3.14;

double *ptr1 = &val; // 싱글 포인터

double **ptr2 = &ptr1; // 더블 포인터

.....................

 

>포인터 배열

:배열에 메모리 주소 값을 저장할 수 있는 배열. , 포인터를 모아놓은 배열이다.

+형식

자료형 *(이름)[숫자];

ex) *(이름)[0], *(이름)[1] .......

#include<stdio.h>

int main()

{

char *arr[3] = {

"Fervent-lecture",

"TCP/IP",

"Socket Programming"

};

 

printf("%s\n",arr[0]);

printf("%s\n",arr[1]);

printf("%s\n",arr[2]);

 

return 0;

}

 

>배열 포인터

:배열을 가리킬 수 있는 포인터.

+형식

자료형 (*이름)[숫자];

ex)(*이름) : 포인터, [숫자] : 숫자만큼 건너뛴다.

#include<stdio.h>

 

void show_data(int (*ptr)[4], int a);

 

int main(void)

{

int arr1[2][4] = {1,2,3,4,5,6,7,8};

int arr2[3][4] = {{1},{2},{3}};

 

show_data(arr1, 2);

show_data(arr2, 3);

 

return 0;

}

 

void show_data(int (*ptr)[4], int a)

{

int i,j;

printf("-----Start Print-----\n");

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

{

for(j=0;j<4;j++)

printf("%d ",ptr[i][j]);

printf("\n");

}

}

 

>포인터 배열과 배열 포인터의 차이점

:포인터 배열 - 각각의 포인터마다 관계가 없는 서로 다른 주소값을 가리킬 수 있다.

:배열 포인터 - 연속적인 메모리만 가리킬 수 있다.

>함수 포인터

:메인 메모리에 올라와 있는 함수를 가리킬 수 있는 포인터

ex)

#include<stdio.h>

 

void SelFunction(int s);

void Add(void);

void Min(void);

 

int main(void)

{

int sel;

 

while(1)

{

printf("선택 : 덧셈(1), 뺄셈(2), 종료(3) ");

scanf("%d",&sel);

if(sel == 3)

break;

SelFunction(sel);

}

printf("프로그램이 종료되었습니다. \n");

return 0;

}

 

void SelFunction(int s)

{

void (*fPtr)(void);

if(s == 1)

fPtr = Add;

else

fPtr = Min;

fPtr();

}

 

void Add(void)

{

int a, b;

printf("덧셈을 위한 두 개의 숫자 입력 : ");

scanf("%d %d",&a, &b);

printf("덧셈 결과 : %d \n\n", a+b);

}

 

void Min(void)

{

int a, b;

printf("뺄셈을 위한 두 개의 숫자 입력 : ");

scanf("%d %d",&a,&b);

printf("뺄셈 결과 : %d \n\n", a-b);

}

<참조 : C 열혈강의>