개발모음집

C 포인터, 구조체, 공용체 본문

Theory

C 포인터, 구조체, 공용체

void 2016. 6. 26. 18:04

1. 포인터 개념과 문자형 포인터



포인터변수는 메모리의 주소를 값을 기억하는 변수를 말한다.



형식


자료형 *포인터변수의 이름;


 - 위치에 따른 '*'의 차이

   1. 선언부, 포인터 변수를 선언하는 것

   2. 수행문, 변수안에 저장된 기억장소가 가리키는 위치의 기억공간의 값



변수 ++; 은 1을 증가하는 것이 아니라, 변수형의 크기만큼 증가한다.


char arr[];
int *p;
p= arr;
p++ // 만약 arr의 주소가 500번지라면, p++은 501번지를 가리키는 것이 아니고, 다음 저장공간을 가리킨다. 그래서 2byte뒤인 502번지를 뜻함

char *, int *, float * 등 어떠한 자료형이든 전부 포인터형이라는 새로운 자료형으로 소형 컴퓨터에서는 모두 다 2byte! (왜냐하면 메모리주소를 2byte로 표현하기 때문)

2. 배열과 포인터과의 관계

예)


char arr[ ] = {'a', 'b', 'c'};

char *p;


주소의 표현: p = arr = &arr[0]

값의 표현: *p = *(arr) = arr[0]


그래서 for문안에 출력할 때는 아래와 같이 표현한다.


주소의 표현: p+i = arr+i = &arr[i]

값의 표현: *(p+i) = *(arr+i) = arr[i]





** 포인터형의 변수와 이 포인터형의 변수가 가리키는 주소의 변수형은 같아야한다.


char arr[];

char *p;



3. 문자배열 초기화


3-1. char Ch[ ] = {'a', 'b', 'c'}; // 'a', 'b', 'c'
3-2. char Ch[ ] = {'a', 'b', 'c'}; // 'a', 'b', 'c', '\0'
3-3. char Ch[ ] = "abc"; // 'a', 'b', 'c', '\0'
3-4. char Ch[2][4] = {"abc", "def"}; // 1열 'a', 'b', 'c', '\0' 2열 'd', 'e', 'f', '\0'
3-5 char Ch[ ][4] = {"abc", "def"}; // 1열 'a', 'b', 'c', '\0' 2열 'd', 'e', 'f', '\0'
3-6. char Ch[ ][4] = {"abc", "def", "ghi"}; // 1열 'a', 'b', 'c', '\0' 2열 'd', 'e', 'f', '\0' 3열 'g', 'h', 'i', '\0'
char *p = "abc"; // 'a', 'b', 'c' '\0'
3-5. char *Ch[2] = {"abc", "def"}; // 1열 'a', 'b', 'c' '\0' 2열 'd', 'e', 'f' '\0'
3-6. char *Ch[ ] = {"abc", "def"'}; // 1열 'a', 'b', 'c' '\0' 2열 'd', 'e', 'f' '\0'

이중포인터 형식


자료형 **포인터변수의 이름;


삼중포인터 형식


자료형 ***포인터변수의 이름;


구조체:


자바의 클래스와 비슷하다


1. Struct 구조체tag {
필드 자료형 필드이름;
...
}
struct 구조체이름 구조체변수; // 메모리 할당
2. Struct 구조체tag {
필드 자료형 필드이름;
...
}구조체 변수;
3. Struct {
필드 자료형 필드이름;
}구조체 변수;
4. typedef Struct 구조체tag {
필드 자료형 필드이름;
}재정의 타입명;
재정타입명 구조체변수









구조체의 멤버변수에 접근하는 방법


구조체변수.멤버변수




공용체:


구조체랑 비슷하다

구조체의 크기는 각각 멤버변수크기의 총합이 크기라면

공용체의 크기는 멤버변수 중 제일 큰 멤버변수크기가 공용체크기다.

그래서 메모리의 효율성이 좋다.