일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 취약점
- jvm
- IMPLEMENT
- javap
- 일상회피
- abstract
- Shared Elements
- throws
- Transition
- bytecode 분석
- HelloWorld
- opcode
- extends
- 치유
- 회피
- 버킷리스트
- static
- 보안
- Interface
- 일상탈출
- Navigation Component
- Android
- 여행계획
- 심리여행
- 심리학
- ㅇ
- 여행
- Recylcer
- bytecode
- 보안취약점
- Today
- Total
패스트터틀
[basic] 구조체 포인터 함수 포인터 본문
본 포스팅은 목차순서에 연결성이 없고 단지 궁금증을 풀고 순서없이 적은 목차입니다.
목차-----------------------------------------------
-메모리와 포인터
-함수와 메모리 어셈블리코드
-구조체를 사용하는이유
-구조체의 크기는 실제와 왜 다른가
-구조체 배열 선언
-구조체 포인터 배열
-구조체 초기화
-구조체 = 구조체
-공용체 union 사용이유
-typedef는 무엇인가 왜쓰나?
-함수포인터와 typedef
-함수포인터
-함수포인터가 왜 필요한가?
-함수 매개변수로 받고 전달하기
-함수포인터형식
-함수 포인터를 함수의 반환값으로 사용하기
메모리와 포인터
함수와 메모리 어셈블리코드
구조체를 사용하는이유
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는 무엇인가 왜쓰나
c++에서는 typedef 말고 using사용 (단, namespace하고는 상관없다고함)
무엇보다 간단하게 할려고 쓰는게 가장크다고함
함수포인터를 typedef 선언해서 쓰는 이유는 보기 쉽고 간편해서이다.
함수포인터와 typedef
함수 포인터를 만들 때 int (*fp)(int, int);처럼 일일이 반환값 자료형과 매개변수 자료형을 명시
이런 방식을 full pointer type이라고 하는데 사용하기가 상당히 번거롭습니다.
이때는 typedef로 별칭을 정의하면 함수 포인터를 매번 만들지 않아도 됩니다
함수 포인터
함수 포인터도 그냥 포인터와 같이 똑같이 생각하면되는데 그냥 함수를 받을수있다고 생각하면됨
왜냐하면 그냥 변수도 메모리에 상주하는것이고 함수도 메모리에 상주하는것이라는것에서 동일하기 때문
함수포인터가 왜 필요한가?
함수를
정적바인딩(컴파일타임)뿐만이 아니라,
동적바인딩(런타임)도 가능하게 하기위해 필요합니다
실행중에 다른 함수를 불러오고 싶을때 필요하기 때문이다.
함수 매개변수로 받고 전달하기
함수포인터형식
함수 포인터를 함수의 반환값으로 사용하기
어느경우에 사용하나 아직 잘모르나 일단 이해하고 넘어가자
#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 |