패스트터틀

[basic] 구조체 포인터 함수 포인터 본문

Development language/c

[basic] 구조체 포인터 함수 포인터

SudekY 2019. 8. 21. 14:05

본 포스팅은 목차순서에 연결성이 없고 단지 궁금증을 풀고 순서없이 적은 목차입니다.

목차-----------------------------------------------

-메모리와 포인터

-함수와 메모리 어셈블리코드

-구조체를 사용하는이유

-구조체의 크기는 실제와 왜 다른가

-구조체 배열 선언

-구조체 포인터 배열

-구조체 초기화

-구조체 = 구조체

-공용체 union 사용이유

-typedef는 무엇인가 왜쓰나?

-함수포인터와 typedef

-함수포인터

-함수포인터가 왜 필요한가?

-함수 매개변수로 받고 전달하기

-함수포인터형식

-함수 포인터를 함수의 반환값으로 사용하기

 

 

메모리와 포인터

 

https://m.blog.naver.com/PostView.nhn?blogId=itperson&logNo=220821884483&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

메모리 저장 구조 이해하기

프로그래밍을 할 때 각 데이터는 위 이미지와 같은 형태로 저장이 된다. 각 영역에 대해 간단히 짚고 넘어...

blog.naver.com

 

 

함수와 메모리 어셈블리코드

 

 

구조체를 사용하는이유

 

1. 데이터의 노가다를 하는것을 막기위해서

2. 소스가 간단해짐

 

struct Person p1;

 

struct Person{

#inlcude<stdio.h>

struct Person{
	char name[20];
    int age;
    char address[100];
};

void main(int argc,char* argv[]){
	struct Person p1;
    
    p1.name = 
    p1.age = 
    p1.address = 
    
}



    

 

구조체의 크기는 실제와 왜 다른가

 

구조체 배열 선언

 

  • struct 구조체이름 변수이름[크기] = { { .멤버이름1 = 값1, .멤버이름2 = 값2 }, 
                                                                { .멤버이름1 = 값3, .멤버이름2 = 값4 } };
  • struct 구조체이름 변수이름[크기] = { { 값1, 값2 }, { 값3, 값4 } };

 

구조체 포인터 배열

 

#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일

struct Point2D {
    int x;
    int y;
};

int main()
{
    struct Point2D *p[3];    // 크기가 3인 구조체 포인터 배열 선언

    // 구조체 포인터 배열 전체 크기에서 요소(구조체 포인터)의 크기로 나눠서 요소 개수를 구함
    for (int i = 0; i < sizeof(p) / sizeof(struct Point2D *); i++)    // 요소 개수만큼 반복
    {
        p[i] = malloc(sizeof(struct Point2D));    // 각 요소에 구조체 크기만큼 메모리 할당
    }

    p[0]->x = 10;    // 인덱스로 요소에 접근한 뒤 화살표 연산자로 멤버에 접근
    p[0]->y = 20;
    p[1]->x = 30;
    p[1]->y = 40;
    p[2]->x = 50;
    p[2]->y = 60;

    printf("%d %d\n", p[0]->x, p[0]->y);    // 10 20
    printf("%d %d\n", p[1]->x, p[1]->y);    // 30 40
    printf("%d %d\n", p[2]->x, p[2]->y);    // 50 60

    for (int i = 0; i < sizeof(p) / sizeof(struct Point2D *); i++)    // 요소 개수만큼 반복
    {
        free(p[i]);    // 각 요소의 동적 메모리 해제
    }

    return 0;
}

 

구조체 초기화

 

for (int i = 0; i < sizeof(p) / sizeof(struct Person *); i++)
{
    p[i] = malloc(sizeof(struct Person));
    memset(p[i], 0, sizeof(struct Person));
}

 

 

구조체 = 구조체

 

 

 

 

공용체 union 사용이유

 

 

데이터낭비 측면에서 보면 좋음

typedef는 무엇인가 왜쓰나?

 

typedef는 무엇인가 왜쓰나

http://web.yonsei.ac.kr/hgjung/Lectures/GEN131/%EC%A0%9C13%EC%9E%A5%20%EA%B5%AC%EC%A1%B0%EC%B2%B4.pdf

c++에서는 typedef 말고 using사용 (단, namespace하고는 상관없다고함)

무엇보다 간단하게 할려고 쓰는게 가장크다고함

함수포인터를 typedef 선언해서 쓰는 이유는 보기 쉽고 간편해서이다.

 

함수포인터와 typedef

 

함수 포인터를 만들 때 int (*fp)(int, int);처럼 일일이 반환값 자료형과 매개변수 자료형을 명시

이런 방식을 full pointer type이라고 하는데 사용하기가 상당히 번거롭습니다.

이때는 typedef로 별칭을 정의하면 함수 포인터를 매번 만들지 않아도 됩니다

 

 

함수 포인터

 

 

함수도 포인터임 결국 메모리안에있는것

 

함수 포인터도 그냥 포인터와 같이 똑같이 생각하면되는데 그냥 함수를 받을수있다고 생각하면됨

왜냐하면 그냥 변수도 메모리에 상주하는것이고 함수도 메모리에 상주하는것이라는것에서 동일하기 때문

 

 

함수포인터가 왜 필요한가?

 

함수를
정적바인딩(컴파일타임)뿐만이 아니라,
동적바인딩(런타임)도 가능하게 하기위해 필요합니다

 

실행중에 다른 함수를 불러오고 싶을때 필요하기 때문이다.

 

필요성1
필요성2

함수 매개변수로 받고 전달하기

함수 매개변수로 받고 전달하기

함수포인터형식

 

함수 포인터를 함수의 반환값으로 사용하기

 

어느경우에 사용하나 아직 잘모르나 일단 이해하고 넘어가자

 

함수 JMP의 형태로 명시되어있는것

#include <stdio.h>

int add(int a, int b)    // int형 반환값, int형 매개변수 두 개
{
    return a + b;
}

int (*getAdd())(int, int)    // 함수 포인터를 반환값으로 지정
{
    return add;    // add 함수의 메모리 주소를 반환
}

int main()
{
    printf("%d\n", getAdd()(10, 20));    // 30: getAdd를 호출한 뒤 반환값으로 add 함수 호출

    return 0;
}

 

 

 

 

'Development language > c' 카테고리의 다른 글

[basic] 함수 - Function  (0) 2019.08.29
[basic] 파일  (0) 2019.08.29
[basic] c 배열 포인터 메모리  (0) 2019.08.14
Comments