본문 바로가기

언어/C, C++, C#

[ C ] 포인터2

함수 포인터

 

: 함수가 저장된 메모리 공간의 주소값

 

반환형 + 포인터 이름 + 매개변수 선언 

int (*fptr) (int)

-> fptr : 포인터

    int : 반환형이 int인 함수 포인터

   (int) : 매개변수 선언이 int 하나인 함수 포인터 

int WhoIsFirst(int age1, int age2, int (*cmp)(int n1, int n2))
{

return cmp(age1, age2); -> 받는 함수 이름에 따라 달라짐

}

int OlderFirst(int age1, int age2)
{

if(age1 > age2)
 return age1;
else if(age1 < age2)
 return age2;
else
 return 0;
 
}

int YoungerFirst(int age1, int age2)
{

if(age1 > age2)
 return age1;
else if(age1 < age2)
 return age2;
else
 return 0;
 
}

int main(void)
{

int age1 = 20;
int age2 = 30;
int first;

printf("입장순서 1");
first = WhoIsFirst(age1, age2, OlderFirst);
printf("%d세와 %d세 중 %d세가 먼저 입장", age1, age2, first);

printf("입장순서 2");
first = WhoIsFirst(age1, age2, YoungerFirst);
printf("%d세와 %d세 중 %d세가 먼저 입장", age1, age2, first);

return 0;
}

 

 

 

Void인 포인터 함수

 

void Func(void)
{

printf("안녕");

}

int main (void)
{

int num= 20;
void * ptr;

ptr = &num;
printf(ptr);   -> 주소값 나옴

ptr = Func;
printf(ptr);   -> 주소값 나옴

return 0;

}

무엇이든 담을 수 있고, 주소 또한 담을 수 있다

 

 

 

main 함수에서 인자 받기

 

int main(int argc, char *argv[])
{

int i = 0;
printf("전달된 문자열의 수: %d",argc);

while(argv[i]!=NULL)  -> 콘솔로 받은 문자열에서 NULL있으면 문자 자름
{
  printf("%d번째 문자열: %s",i+1 , argv[i]);   
  i++;
}

}

 

 

구조체에서의 포인터

 

반환형 + 구조체 이름 + 포인터 이름

struct point * ptr

 

구조체에서 포인터는 화살표 표기를 사용한다

(ring.center)-> xpos, (ring.center)-> ypos

pptr->xpos, pptr->ypos

struct point
{

int xpos;
int ypos;

}

int main (void)
{

struct point pos1 = {1, 2};
struct point pos2 = {100, 200};
struct point * pptr = &pos1;

(*pptr).xpos += 4;
(*pptr).ypos += 5;
printf("%d ,%d" , pptr->xpos, pptr->ypos);

pptr = &pos2;
pptr -> xpos +=1;
pptr -> ypos +=2;
printf("%d ,%d" , (*pptr).xpos , (*pptr).ypos);

return 0;
}

 

struct point
{

int xpos;
int ypos;

}

struct circle
{

double radius;
struct point * center;

}

int main(void)
{

struct point cen = {2, 7};
double rad=5.5;

struct circle ring = {rad, &cen};
printf("반지름 %g",ring.radius);       //5.5
printf("원 중심 %d, %d", (ring.center)-> xpos, (ring.center)-> ypos);    //2, 7
return 0;

}

 

'언어 > C, C++, C#' 카테고리의 다른 글

[ C# ] 람다함수  (0) 2022.07.03
[ C# ] main함수 여러 개일 때 컴파일  (0) 2022.07.02
[ C ] Stream  (0) 2022.06.02
[ C ] 포인터  (0) 2022.05.29
[ C# ] 닷넷 예제 공부  (0) 2021.12.16