본문 바로가기

UNIX_LINUX_C_C++

구조체, 배열, 포인트변수 설명

일단 소스는 정확합니다.

사람들이 흔히 혼동하는 부분은 일반변수와 배열, 포인터의 차이입니다.

일반 변수 int a=3;라던가 char b=4;같은 것들은 이름입니다.

int a=3;

int*b;

*b=a;

이렇게 선언해야 비로서 3이라는 값이 a라는 이름의 변수에 들어있는데, 그 a라는 이름의 주소값이 b가 되는거죠. 하지만 배열

int a[10];

이라고 선언해버리면,

a[10];은 그대로 주소값이 됩니다.

어려우신가요? 변수를 집이라고 생각하세요.

int a;

는 주택을 지은 것이구요,

a=10;

은 a라는 집에 10이라는 사람을 이사시킨것이고,

int *b;

이것은 동작구에다가 집을 하나 짓겠다고 신고한겁니다.

그리고,

*b=a;(여기서 주의할 점은 b는 변수의 이름이고, *는 주소를 담겠다는 의미입니다. 주소를 어디론가 보내거나 출력할 때는 *가 필요없어지죠. )

는 a라고 지은 집을 집의 주소를 집 다 지었다고, 알린 것이지요. 그럼 동작구에다가 b라는 주소의 집이름이 뭐냐고 *b 이렇게 물으면,a라고 잡해줄 것입니다. 그리고, *b라는 주소에 누가 살고 있냐?라고 물으면, 10이 살고 있다고 그럴 것입니다.

그런데동작구청서,있는 성북구청에 있는 A시공사에게 주택이 이러이러하니 보강공사를 해야겠다고 A();라는 함수를 호출하면서, 주택이름을 알려주면, a라는 주택을 고쳐라 하면 모르겠죵. 그래서 a라는 값을 보내지 않고 동작구청에 &a 혹은 b라고 주소값을 보내게 됩니다.

하지만 이것이 아파트, 즉 행렬이나 구조체처럼 지어진 것이라면 다름니다.아파트를 지으면, 아파트 이름이 그 동네 안에서바로 주소가 되는것처럼구조체와 행렬은 그 자체로 주소가 됩니다. 그렇기에 다른 지역에 있는 시공업체에 통보해줄때도, 바로 그냥 아파트 이름을 보내준답니다. 아파트 이름이 주소니까요. 그렇기에 함수를 호출할 때에는

foo(temp);

이렇게 바로 구조체의 이름을 보냅니다. 이름=주소지요. 행렬이나 구조체의 이름은 실지로는 주소입니다.

다만 형식을 구조체식으로 temp.x로사용함 주소값 뒤에 있는 x 값을 temp라는 아파트 단지내에서 아파트단지 계획도 abc를 보고 x라는 값을 찾을 뿐,temp 는 주소입니다.

아파트에 비유한 주석달기~!!!!

#include <stdio.h>

struct abc{

int x;

int y;

int z;

};

아파트 구조도

void goo(struct abc* temp) {

temp[0].x = 7;

temp아파트의 0동 x호의 모자란 나머지 하청 공사를 함

}

a시공회사의 하청업체

void foo(struct abc* temp)

{

temp[0].x = 1;

temp라는 아파트에0동 x호를 보강강공사.

temp[1].y = 2;

temp라는 아파트에1동 y호를 보강강공사.

goo(temp);

하청업체 goo에게나머지마무리 업무를 하청주며,temp아파트이 름 전달.

}

a시공회사

void main()

{

struct abc temp[10];

abc라는 형식의 아파트를 짓고아파트이름을 temp라고 명명

foo(temp);

foo라는 건설업체에 temp라는 아파트의 보강공사를 맡김

printf("%d \n", temp[0].x);

printf("%d \n", temp[1].y);

보강공사 보고

}

나름 이 부분에서 많이 헤멨었기에 열심히 설명해봤는데 더 어려운건 아닌지 모르겠네요.

즐거운 배움의 나날들 되시기를 바랍니다