포인터 와 변수

C언어 2018. 1. 9. 23:44



포인터 변수를 사용하는 경우는 저장될 내용이 유동적일때

배역을 사용하는 경우는 저장 내요을 한정적인 범위 내에서 사용할때 사용되며


배열은 = 포인터 라고 생각하자



#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
DkDragon

,