#include <stdio.h>
typedef int INT;
typedef int * PTR_INT;
typedef unsigned UINT;
typedef unsigned int * PTR_UINT;
typedef unsigned char UCHAR;
typedef unsigned char * PTR_UCHAR;
int main(int argc, const char * argv[]) {
INT num = 1; // int num =1;
PTR_INT ptr = #// int * ptr = #
UINT num2 = 100000;// unsigned int nun2 = 10000;
PTR_UINT utpr = &num2;//unsigned int * utpr = &num2;
UCHAR ch = 'Z';//unsigned char ch = 'Z';
PTR_UCHAR chptr = &ch;//unsighed char* chptr = &ch;
printf("%d, %u, %c\n",*ptr, *utpr, *chptr);//출력하는 방법
}
typedef name1 name2 name3 이렇게 입력하면 마지막에 선언한 name3가 name2, name1을 재정의해서
name2, name3가
//구조체를 선언함과 동시에 typedef로 구조체명을 POINT로 바꿈.
typedef struct point{
int posx;
int posy;
} POINT;
//구조체 선언 뒤에서 바로 typedef로 POINT를 정의함
struct point{
int posx;
int posy;
};
typedef struct point POINT;
개발자들이 주로 위에 있는 선언을 많이 사용한다고 합니다.
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS_
typedef struct point{
int posx;
int posy;
}Point;
typedef struct person{
char name[20];
char phonenum[20];//구조체 내부에 배열을 선언함
int age;
}Person;
Person getPersoninfo(void){
Person person;
printf("name: ?");
scanf("%s",person.name);
printf("\nphomenum: ?");
scanf("%s",person.phonenum);
printf("age: ?");
scanf("%d",&person.age);
return person;
}
void showPerson(Person person){
printf("[");
printf("name : %s",person.name);
printf("\nPhonenum : %s",person.phonenum);//구조체 내부의 배열이 그대로 촐력됨.
//배열 자체도 통재로 복사되어서 들어간다.
printf("\nage : %d",person.age);
printf("]");
}
void showPoint(Point point){
printf("location of point : %d , %d\n",point.posx, point.posy);
}
Point getcurrentLocation(void){
Point point;
printf("input current location:");
scanf("%d %d",&point.posx, &point.posy);//객체의 레퍼런스가 전해진것이 아니기 때문에 반드시 반환값을 전해줘야함.
//여기서 값이 저정되는 곳은 파라미터로 전달된 복사본 자리에 저장되는 것이다.
return point;//만들어진 point객체로 전달 반드시 반환해서 전해줘야 함 이건 call by value
}
int main() {
Point point1 = getcurrentLocation();//함수에서 반환된 point 객체의 복사본이 point1에 저장됨.
showPoint(point1);//파라미터로 복사되어 call by refercence로 호풀되어서 들어감.
Person person = getPersoninfo();
showPerson(person);
}
위의 코에서 반환하는ㄴ 객체의 리스트가 전부볷사되어서 반환됨.
Person getPersonInformation(Person person){
Person person;
printf("name: ?");
scanf("%s",person.name);
printf("\nphomenum: ?");
scanf("%s",person.phonenum);
printf("age: ?");
scanf("%d",&person.age);
return person;
}
c언어에서 함수는 기본적으로 call by value 이기 때문에 구조체 또한 동일하게 적용이 된다 하지만 이를 call by reference로 전환하기 위해서 구조체 포인터를 사용해야하고 다음 예제는 이를 이용해서 각 구조체안에 들어 있는 정보의 위치를 바꾸는 함수를 작성함
#include <stdio.h>
typedef struct point {
int posx;
int posy;
} Point;
void printPoint(Point point) {
printf("current location is : [ %d , %d ]\n", point.posx, point.posy);
}
void changeLocation(Point *pptr1, Point *pptr2) {
int locationtmpx = pptr1->posx;
int locationtmpy = pptr2->posy;
pptr1->posx = pptr2->posx;
pptr1->posy = pptr2->posy;
pptr2->posx = locationtmpx;
pptr2->posy = locationtmpy;
}
int main() {
Point point = {12, 123};
Point point1 = {1234, 34523};
printPoint(point);
printPoint(point1);
changeLocation(&point, &point1);
printPoint(point);
printPoint(point1);
}
위의 코드에서 사용하는 함수인 changeLocation 은 구조체에 저장되어 있는 위치정보를 전환하는 과정을 담았다.
Point point1 = {1234, 34523};
printf("size of point struct is %d\n",sizeof(point3));
point1 = point3;
printPoint(point1);
초기화 과정에서 point1 객체의 값을 point3와 다르게 설정했지만 대입연산을 통해서 구조체 안에 있는 변수들의 값을 한번에 변경이 가능하다. 복사된 값을 그대로 저장하기 때문이다.
구조체에 주소 연산 혹은 사이자 반환연산 이외의 연사을 적용하려면 함수를 선언해서 사용해야한다.