포인터 변수를 사용하는 경우는 저장될 내용이 유동적일때
배역을 사용하는 경우는 저장 내요을 한정적인 범위 내에서 사용할때 사용되며
배열은 = 포인터 라고 생각하자
#define ROW 5
#define COLUMN 2
char* sys_msg[ROW][COLUMN] = {
{ "1.","start"},
{ "2.","stop" },
{ "3.","conn" },
{ "4.","discon" },
{ "5.","init" },
};
char* XXX[] 문자열 배열 변수
char* XXX[][] 문자열 2중 배열 변수
따라서 배열 인자가 모두 문자열만 가질수 있다.
그런후 ROW 는 COLUMN 의 크기를 가진 배열을 몇개 선언 하는지
typedef struct {
int pid;
char *pName;
}PS_INFO;
static PS_INFO sys_msg[ROW] = {
{ 1,"start" },
{ 2,"stop" },
{ 3,"conn" },
{ 4,"discon" },
{ 5,"init" },
};
위 코드에서는 리턴값을 PS_INFO 라는 구조체라 한다 그래서 하나의 행에서 컬럼값이 각각 숫자,문자열 두개가된다
위 사진 부터는 새로운 문자 들이 보이는데
( & 해당변수의 주소)
( * 해당 변수의 값) 을 의미한다.
주소 = 포인터 개념으로 이해한 상태에서
2차원 배열을 선언하고 변수타입을 구조체로 잡았다.
그러므로 구조체 가지는 변수인자 {1000 ,"sart"} 선언
요기서 행과 열은 행은 맨 왼쪽으 중괄호로 나뉘 ,(컴마)
열은 다시 행이 가지는 ,(콤마의 갯수)
{
{//1행
{}, {}, {} //3열
}.
{//2행
{}, {}, {}, //3열
}
}
중요한것은 행의 갯수는 가변적으로 선언가능하지만 열은 각 행마다 공통적인 크기 때문에 비워 둘수 없다
비운상태로 컴파일 하면 에러가 발생한다
이부분에서 주목 해야 하는 것은
printf("### %d ###\n", (*sys_msg[i]).pid); //이부부은 2차원 배열의 행의 첫번째인자의 pid값
printf("..# %s ###\n", (*sys_msg[i]).pName); //이부부은 2차원 배열의 행의 첫번째인자의 pName값
printf("### %d ###\n", (int)(&info[i])->pid); //구조체 변수로 형변환 하여 1차원 배열로 인식
printf("..# %s ###\n", (char*)(&info[i])->pName); // //구조체 변수로 형변환 하여 1차원 배열로 인식
그리하여 1차원 배열로 인식된 내용을 출력창에서 확인할수 있다. 위 와는 다르게 1000, 1001, 2000, 2001 순으로 순차적으로 출력하는 것을 확인 할 수 있다.
요기서 재미난 것은 PS_INFO 구조체의 포인터형 info 변수를 선언하여서 info 변수를 배열처럼 사용 가능하게 하였고
(&inf[])->XXX 처럼 사용가능하게 된것인다.
'C언어' 카테고리의 다른 글
Dev-C C++ 5.1.1 -컴파일러 설치 (0) | 2018.01.20 |
---|---|
삼항 연산자 (0) | 2018.01.15 |
변수명명법 (0) | 2018.01.09 |
하드코딩을 줄이고 디파인 Define 사용을 늘리자 (0) | 2017.12.23 |
Hello Word 로 C언어 시작 (0) | 2017.12.23 |
WRITTEN BY