포인터, const,

float PI=3.14

PI=3.17 //분명히 실수

const float PI=3.14
PI의
상수화..값을 변경하려고 하면 오류 발생

const int p=1;
//p값 변경 불가
p=5; //에러

const int* p = &a;
//데이터 상수화 : 포인터를 통한 데이터 변경 불가
*p=30; //에러
a=30;
//OK
포인터p를 통해서 값을 변경하는 것만 막는다.
a의 값은 변경가능

int* const p =
&a;
//포인터 상수화 : 포인터값 자체 변경을 불가
p=&b;  //ERROR
*p=30;  //OK
포인터p가 가리키는 값을 변경하는 것을
막는다.

const int* const p=&a;
//
p=&b; //ERROR
*p=30;
//ERROR
포인터를 통해 변경불가..

다차원 배열 포인터

포인터에는 이동 정보가 포함
int (*pArr) [4];
int형 변수를 가리키는 포인터
pArr은 포인터
4
칸씩 건너뛴다.

int arr1[3][2];
int arr2[2][3];

printf("%d ",
arr1 );

arr1
arr1+1
arr1+2

arr2
arr2+1
arr2+2

arr[i]
== *(arr+i) 는 arr이 포인터 변수이거나 배열 이름인 경우에 항상 성립한다.

함수포인터, void형 포인터, main함수를 통한 인자전달

int (*fPtr1) (int);
void (*fPtr2) (int, int);

1번째는 fPtr1이라는
포인터가 int형 인자를 한개받고 int형 반환을 하는 포인터를 가리킬 수 있다.
2번째는 fPtr2라는 포인터가 int형
인자를 두개 받고 void형 반환을 하는 포인터를 가리킬 수 있다.

void SelFunction(int a)
{
 
void (*fPtr) (void);
  if(s==1)
     fPtr=Add; //Add함수를 fPtr에 연결
 
else
      fPtr=Min; //Min함수를 fPtr에 연결
  fPtr();  //함수 포인터 호출...
}

char
c = 'a';
int n=10;

void *vp;  //void 포인터 선언
vp=&c;
vp=&n;

void형 포인터는 일을 하지 못한다.
대신 모든 값을 저장할 수 있다.
명시적 형 변환을 통해 사용한다.

int
n=10;
void *vp=&n;  //void형 포인터 선언 및 초기화
*vp=20;  //ERROR
vp++; 
//ERROR
void형 포인터는 포인터 자체에 대한 정보가 없기 때문에 값을 저장하는 것 외에는 아무것도 하지 못한다.

int
n=10;
void *vp=&n;  //void 포인터 선언 및 초기화
*((int*)vp)=20;
void
형 포인터가 가리키는 값을 20으로 변경하기 위해 int형 포인터로 형변환한다. 이렇게 하면 에러가 발생하지 않는다.

main
함수를 통한인자 전달
dos시절에.. 또는 리눅스 커널에서 많이 쓰는 명령어형식...
int main(int argc,
char **argv)
압축을 풀 때는
lhz x game.zip
압축파일에 따라 다르지만 뭐 이런식으로...
명령을 넣었던 것 같다.
리눅스는 tar -zxvf game.tar.gz

int argc를 통해서
문자열의 갯수가 전달된다.
lhz, x, game.zip 세개가 전달되었으니
문자열을 담을 char형 포인터배열
char*arr[3];을 형성해서,
arr[0],arr[1],arr[2] 세개가 문자열배열로 구성되어 main함수로
전달된다.

main함수의 선언을 이렇게 해도 똑같다.
int main(int argc, char *argv[])

//
함수 이름 자체도포인터다.

구조체, 구조체 배열, 구조체 포인터, 공용체, 열거형

구조체 정의
struct point
{
    int x;
    int y;
};

구조체
를 '사용자 정의 자료형'이라 하고
구조체를 이루는 변수를 '구조체 멤버'라고 한다.

struct point
{
  
int x;
   int y;
} p1, p2, p3;

조체 정의와 변수 선언을 동시에 할 수 있음

struct point
{
 int x;
 int y;
};

int
main(void)
{
 struct point p1,
p2, p3;

 return 0;
}
메인함수에서 구조체 변수 선언을 할 수도 있다.

-------------
구조체 초기화 방법들..--------
struct person
{
 char name[20];
 char
phone[20];
 int age;
};

int main(void)
{
 struct person p1={"Free Lec",
"02-3142-6702", 20};
  //배열 초기화 문법을 구조체에 적용
 struct person p2={.age=20, .name="Free Lec",
.phone="3142-6702"};
//구조체 멤버 변수를 지정하여 초기화

 struct person pArray[3];  //구조체를 배열로
선언
 
 printf("이름, 전화번호 순으로 입력: ");  //반복문을 쓰면 한번에 여러개를 입력 가능
 scanf("%s %s", pArray[i].name,
pArray[i].phone);

 struct person * pMan;  // pMan은 구조체를
가리키는 포인터

 return 0;
}

구조체 포인터
struct person * p;

--------------------------
구조체 용도...사용법
구조체도 call by reference ... call by value 의 방법으로 함수에 전달이
가능하고
동일한 구조체 끼리의 연산도 가능하다.
p2=p1;
char *number=p2.phone;


조체가 구조체에 포함되는 것도 가능함, 중첩된 구조체
struct
point

{
 int x;
 int y;
};

struct circle
{
 struct point p;
 double radius;
};

중춥된 구조체의 초기화
struct
circle c = {1, 2, 3.0 };
struct circle c = { {1, 2}, 3.0};
두 가지
형태 모두 가능
struct circle c={1, 2} << point p의 요소는 x=1, y=2로..
radius는 default인 0으로 초기화
struct circle c={ {1}, 2} << point p의
x=1, y는 default인 0으로, radius=2.0 으로 초기화

---------------typedef를
이용한 구조체 정의 쉽게 만들기---------------------
typedef 는 이미 존재하는 자료형에 이름을 붙이기
위한 용도로 사용된다.

#include <stdio.h>
struct Data
{
 
int data1;
  int data2;
};

typedef
struct Data Data;

int main(void)
{
 Data d={1,2};
 printf("%d, %d,
\n", d.data1, d.data2);

  return 0;
}
-----------
typedef struct Data
{
  int
data1;
  int data2;
} Data;


용체-----------
구조체와 비슷한데 약간 다른점..
: 멤버 중 가장 메모리를 많이 요구하는 멤버에 초점을
맞춰서 메모리를 할당한다.
구조체와는다르게 개별적으로 메모리를 할당받지 않고 통합적으로 한개의 메모리를 할당받는다.

시에 여러개가 저장되지 못한다.
--하드웨어 프로그래밍 시 많이 사용된다고 한다.

union data
{
int
d1;
double d2;
char d3;
};
열혈강의 523p

열거형
-------------------------선언방법 및 사용 527p
enum color {RED=1, GREEN=3,
BLUE=5};
숫자를 지정해주면 그 숫자가 입력

enum color {RED, GREEN=100, BLUE};

렇게 선언하면
RED=0, GREEN=100, BLUE=101으로 선언

#include
<stdio.h>

enum days {MON, TUE, WED, THU, FRI, SAT, SUN} //
숫자를 지정하지 않으면 순서대로 입력

int main(void)
{
  enum days day;
 
printf("Input a day(0:Monday~6:Sunday) : ");
  scand("%d",&day);
 
switch (day)
  {
  case MON :
     printf("수영을 하세요.\n");
    
break;
  case TUE :
      printf("조깅을 하세요.\n");
      break;
 
case......
...............
...
  }
  return 0;
}


행결과
Input a day(0:Monday ~ 6:Sunday) : 1(ENTER)
수영을 하세요.