일요일, 5월 5
Shadow

#004 변수 part 02

01. 변수
ㅇ 메모리 구성요소 – 숫자
– 컴퓨터를 구성하는 모든것은 숫자로 이루어져 있습니다. 숫자를 하나 저장하려고 합니다. 저장하는 이유는 어디선가 사용하기 위함입니다. 여러개의 하드디스크 드라이브가 있고, 메모리가 있스빈다. 그러나, 숫자를 저장할수 있는 곳은 무조건 메모리가 될수 밖에 없습니다. CPU는 너무 빠르기 때문에 하드디스크에 저장하면 숫자를 읽어오는 동안 대부분의 시간을 놀아야 합니다. 메모리는 CPU의 능력을 최대한 사용하기 위한 고속의 데이터 저장공간으로 CPU가 사용하려는 모든 숫자는 사용전에 하드 디스크로 부터 메모리에 복사됩니다. CPU를 제외하면 메모리가 두번쨰로 빠른 녀석인 셈입니다.

ㅇ 숫자 하나를 저장하는데 드는 비용  – 세개의 숫자
어디에 저장해 놓았는지 알아야 나중에 가져다 쓸수 있습니다. 첫번째 숫자는 5를 저장한 메모리상의 위치입니다. 두번째는 5라는 숫자를 저장하기 위해 사용한 메모리의 크기입니다. 5를 저장하기 위해 1바이르르 사용했는지 2바이트를 사용했는지 꼭 기억하고 있어야 합니다.
1. 상수 5
2. 주소번지 : 100번지
3. 방의 크기 : 4바이트

첫번째 : 무언가를 저장하는것에 있습니다. 메모리는 숫자를 저장하니다. 두번쨰는 메모리에서도 저장한 숫자를 사용하기 위해서 주소를 기억해야 합니다. 세번째는 어떤숫자를 저장하느냐에 따라 사용하는 메모리의 크기가 달라집니다.

변수에 숨어있는 세개의 숫자 확인
#ncldue<stdio.h>
int main()
{
int n=5;
printf(“숫자 : %d, n);
printf(“주소 : %d,&n);
printf(“크기 : %d, sizeof(n));
return 0;
}
숫자 : 5
주소 : 1245604
크기 : 4

ㅇ 숫자의 두가지 형태 – 변수와 상수
int n = 5;
메모리에 숫자를 저장하기 위해서는 세개의 숫자가 필요하고, 필요한 숫자를 모두 제공했기 때문에 n이 가리키는 곳에 가면 4바이트 크기를 사용하는 숫자 5가 저장되었습니다.
앞의 선언에는 메모리에서 사용할수 있는 두가지 종류의 숫자가 모두 들어있스빈다. 단순한 메모리는 단순한 만큼 저장할수 이는 종류의 숫자도 단 두가지 밖에 없습니다. 첫번째는 변할수 있는 숫자를 저장하는 메모리 영역으로 변수를 뜻합니다. 두번쨰는 변하룻 없는 숫자를 저장하는 메몰 영역으로 변수를 뜻합니다. 변수와 상수는 모두 메모리 영역에 저장되는 숫자로, 변할수 없느냐 이외에는 전혀 차이가 없습니다,
n을 변수라고 하고, 5를 상수라고 합니다. n은변할수 있는 메모리 영역이기 때문에 5이외의 다른 숫자도 저장할수 없습니다. 프로그램에서 5라는 숫자를 사용하기 위해서는 메모리에 존재해야 하지만 그값을 변경할수없다는 것을 뜻합니다

ㅇ 메모리가 할수 잇는 두가지 작업 – 읽기와 쓰기
– 메모리에 대해 할수 있는 작업 : 읽기와 쓰기 밖에 할줄 아는것이 없습니다. 메모리에 숫자를 저장한다는 것을 쓴다라고 얘기하고 메모리로부터 숫자를 가져오는 것을 읽는다라고 얘기합니다. 먼저 메모리로 부터 읽어오는 작업은 다음과 같습니다.
먼저 메모리로 부터 읽어온ㄴ 작업은 다음과 같습니다.
m=n;
변수 n에 들어있는 겂을 또 다른 변수 m에 저장했습니다.
#include<stdio.h>
{
int n = 5;
n=9;
&n =9;              //1번
sizeof(n)=9;      //2번
return 0;           //3번
}

메모리 주소와 사용하는 크기는 변경할수 없는 상수입니다. 컴파일 에러가 발생했다면, 2번과 3번 코드 주석으로 막고 다시 컴파일을 해야 합니다.

#include<stdio.h>
#define ALPHABET_COUNT 26
{
prinf(“알파벳 개수 : %d” , ALPHABET_COUNT);
return 0;
}

define문이 하는 역할을 컴파일을 하기전에 오른쪽 첫번째에 잇는 단어를 줄의 마지막에 있는 숫자로 바꿔줍니다. 눈으로 볼때에는 알기쉬운 ALPHABET_COUNT이지만, 컴파일러에게는 여전히 26으로 보입니다. 이런 작업은 전처리기가 모두 처리합니다.
최초코드에 비해 별도의 주석이 필요없습니다. 첫번째 코드는 주석이 없을 경우 읽기가 어려워지지만 지금 만든 코드는 주석이 필요 없기 때문에 가독성이 최적입니다.

* 초기화시키지 않은 변수에 들어있는 값을 쓰레게 값이라고 합니다.
“=” 연산자의 가독성 향상
= 연산자는 오른쪽에 잇는값을 왼쪽에 치환합니다.
int n, m, k;
n=m=k=0;

02. 포인터 변수
ㅇ 자료형의의미
1. 사용중인 메모리의 크기를 의미합니다.
2. 저장된 숫자의 용도를 알려줍니다.
int* 자료형은 가리키는 값이 4바이트 int라는 것을 알려 줍니다.

char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, float, double, long double

ㅇ 자료형 찾기
n = x1;
&n = x2;
sizeof(n) = x3;

int n=5;
x1=n;
x2=&n;
x3=sizeof(n);

= 연산자 왼쪽에는 변수만 올수 있지만, 오른쪽에는 상수도 올수 있습니다.

주소를 저장하는 자료형- 포인터 변수
&n으로 부터 얻은 숫자는 메모리의 위치를 가리키는 주소이고, 일반적으로 4바이트 부호없는 정수로 표현합니다. 따라서 사용할수 있는 주소의범위는 4바이트 부호없는 정수를 가리키는 unsigned int 자료형의 범위와 값습니다.

&n의 주소에는 int 자료형 정수가 저장되어 있으므로, x2의 자료형은 다음과 같습니다.
int* x2;

※ 포인터 변수 선언에서 * 연산자의 위치
* 연산자는 자료형과 변수 이름사이에만 오면 되기 때문에 다음과 같은 세가지 방법을 모두 사용할수 있습니다.
int* p1;
int * p2;
int *p3;
다음은 주소를 저장하는 두개의 변수를 선언하는 코드입니다.
int *p1, *p2;
int자료형은 한번만 써도 되지만, * 연산자는 변수 개수에 맞게 써야 합니다. 이말은 * 연산자는 자료형을 표현해주긴 하지만, 자료형보다는 변수와 친하다는것을 의미합니다. 3번 표기법을 사용하는 이유 입니다.

ㅇ주소를 저장하는데 드는 비용 – 세개의 비용
앞에서 말했던 겂처럼, 주소를 저장해 놓은 것은 나중에 사용하기 위해서 입니다. 그렇다면, 어디에 저장해 놓았는지 알아야 나중에 가져다 쓸수 있습니다. 첫번째 숫자는 주소 5를 저장하고 있는 메모리 상의 위치입니다. 두번째는 해당 위치로 부터 몇 바이트를 사용하는지 알려주는 크기입니다.

ㅇ주소 변수에 숨어 있는 세개의 숫자 확인
int* p = 1234;
주소를 저장하는 변수 p에 주소 1234를 저장했다.

ㅇ주소저장이 갖는 의미
값을 저장하는 int 자료형 변수를 만든 이유는 나중에 사용하기 위해서입니다. 그런 변수의 주소를 저장하는 int* 자료형 변수를 마든 이유 또한 int 자료형 변수를 나중에 사용하기 위해서 입니다. 주소는 엄밀히 말하면 값이 아니라 값에 접근할수 있는 열쇠입니다. 그러나, 경우에 따라서는 직접 접근하는 것이 허용되지 않는 경우가 있습니다.
서로의 영역을 침범하는 것은 프로그램을 읽기 어렵고 쓰기 어렵게 만들기 때문에 허용되지 않습니다. 이말은 어떤 영역에 선언된 변수를 다른 영역에서 직접 사용할수 없다는 것을 뜻합니다. 이때 돌아서 접근하기 위해 주소를 사용합니다. 주소는 언어 차원이 아니라 메모리 차원에서 데이터를 보는 것이기 때문에 주소만 정확하게 알고 있다면 원하는 모든 것을 할수있습니다. 메모리에는 영역 구분이란 것이 존재하지 않습니다.

주소변수 – 포인터 변수
C언어는 주소를 저장하는 변수를 포인터 변수라고 합니다.

포인터 변수 선언에서의 주의점
int* pN1, pN2, pN3;
변수를 동시에 선언할때 자료형은 한번만 나옵니다. 그렇기 때문에 맨 앞에는 int 자료형이 오고, 자료형에 포함되지 않는 * 연산자는 매번 변수 앞에 오는것이 맞스니다.
int *pN1,
*pN2,
*pN3;

여러줄에 걸쳐 선언되었다는 것만 빼면 가독성에 있어 나쁘지 않습니다. 포인터 변수에 초기값을 준다면, 오히려 더 좋은 코드로 바뀔 가능성까지 있는 코드입니다.

각종 포인터 변수의 메모리 사용량
printf(“char* : %d”, sizeof(char*));
printf(“char* : %d”, sizeof(int*));
printf(“char* : %d”, sizeof(double*));

출력 결과에 수긍하지 못하는 분들도 있을겁입니다. char 자료형은 1 바이트, int는 4바이트, double은 8바이트를 사용하는데, 왜 포인터 변수는 모두 4바이트를 사용하는지 이해 되지 않을수도 있습니다. 사용하는 메모리의 크기는 저장할 데이터를 담기에 충분해야 하니다.

주소는 메모리의 첫번째 위치부터 마지막 위치까지를 가리킬수 있어야 합니다. 첫번째 위치에 문자도 올수 있고 정수도 올수 있습니다. 마찬가지로 마지막 위치에도 문자 또는 정수가 올수 있습니다. 메모리에 저장하는 데이터는 이런 이유로 포인터 변수의 크기에 영향을 주지 못합니다. 이것은 모든 포인터 변수가 같은 크기를 가져야 하는 이유 입니다.

결론을 얘기하면 int 나 double과 같은 다양한 값이 저장될 수 있는 위치는 메모리 어디라도 가능하기 때문에 모든 포인터 변수는 같은 크기를 가질수 밖에 없고, 메모리의 처음부터 끝까지 주소를 저장할수 있어야 하기 때문에 충분히 큰 4바이트를 사용합니다.

ㅇ 포인터 변수 읽고 쓰기
int n =3;
int* pN, *pM;
pN=&n;  // 1번
pM=pN; // 2번

*연산자는 변수마다 하나씩 추가해야 모든 변수가 포인터 변수가 됩니다. 1번 코드는 pN이 할당된 메모리에 쓰는 작업으로 포인터 변수 pN에 N의 주소를 저장합니다. 2번 코드는 할당된 메모리에 쓰는 작업으로 포인터 변수 pN에 들어있는 N의 주소를 pM에 치환합니다. 메모리로부터 읽고 쓰는 작업이 값을 저장하는 변수와 하나도 다르지 않습니다. 다만 값이 아니라 저장하거나 읽어오는 데이터가 주소인 점이 다를뿐입니다.

ㅇ 포인터변수를 이요한 간접 접근 – *연산자
포인터 변수는 주소를 저장하기 때문에, 자신이 저장하는 주소를 변경하는것 이외에 저장한 주소가 가리키는 곳에 값도 변경할수 있습니다.

int n=3, m;
int* pN = &n;
*pN = 7;    //1번
m=*pN;     //2번
1번 코드는 pN이 가리키는 주소에 있는 값을 7로 변경합니다. 포인터 변수 pN이 = 연산자의 왼쪽에 왔기 때문에 메모리에 쓰는 작업이 일어납니다. 2번 코드는 pN이 가리키는 주소에 있는 겂을 M에 저장합니다. pN이 가리키는 주소에는 7을 넣었으므로 M에는 7이 저장됩니다.

*연산자는 두가지 용도로 사용합니다. 첫번째는 변수 선언에 사용되어 주소를 저장하는 포인터 변수를 생성합니다. 두번째는 바로 앞이 코드처럼 포인터 변수가 가리키는 주소의 값을 읽어 옵니다. 첫번째는 자료형 오른쪽에 붙었고, 두번째는 변수 이름 왼쪽에 붙었습니다. 쉽게 생각해서, 자료형과 함께 사용하면 포인터 변수 선언이 되고, 변수와 함께 사용하면 뒤에 배울 역참조 연산자가 됩니다.

int n;
int* p = &n;
첫번째 용도로 사용하기 위해 자료형 오른쪽에 붙였으므로, 변수 p를 주소를 저장하는 포인터변수로 선언합니다.
*p = 5;
두번째 용도로 사용하기 위해 변수 이름 왼쪽에 붙였으므로, p에 저장된 주소가 가리키는 변수, 즉, n에 저장된 값을 변경합니다.

ㅇ직접 접근과 간접 접근을 보여주는 예제
#include<stdoi.h>
int main()
{
int n = 3;
int* pN = &N;                                       //1번
printf(“원본 : %d, %d” , n, *pN);
*pN=7;                                                //2번
printf(“원본 : %d, %d” , n, *pN);

return 0;
}

저장한 값에 접근하는 방법은 두가지 입니다. 변수 n을 사용해서 직접 접근하는 방법과 N의 주소를 저장한 pN을 사용해서 간접접근하는 방법이있습니다.
1번에서 N의 주소를 포인터 변수 pN에 저장했습니다. N에 직접 접근하기 위해 변수 이름 N만 썻고, 간접접근을 위해 pN에 *연산자를 붙여 사용했습니다.

ㅇ변수의 값 교환 – 직접교환
중요한 파일은 별도의 폴더에 저장을 해두기도 하고, 중요한 문서는 별도로 복사해서 따로 철을 해두기도 합니다. 맟나가지로 원본을 잃어버리면 안되므로, 복사본을 만들어 이 문제를 해결할수 있습니다. 변수 T는 N,M과 같은 자료형으로 마들어진 변수 입니다. N을 T에 복사합니다. 복사가 완료된 시점부터 N은 두군데에 저장되어 있습니다. 이제 N의 복사본이 있으므로 M을 N에 치환해도 문제가 되지 않습니다.
앞의 설명은 접시에 담긴 물건을 서로 바꾸기 위해 빈 접시를 이용하는 것과 같은 방식입니다. 먼저 A 접시의 물건을 C 접시에 옮깁니다. B 접시의 물건을 이젠 빈 접시가 된 A 접시로 옮깁니다. 마지막으로 C접시에 옮겨 놨던 물건을 빈 접시가 된 B접시로 옮깁니다.

ㅇ변수의 값 교환 – 직접 교환
첫번째는 변수 이름을 직접 사용하는 방법으로 앞에서 보았습니다. 두번째 방법은 값을 저장한 변수의 주소를 사용하는 방법을 보도록 하죠.
#include<stdio.h>
int main(){
int n – 3, m -7, t;
int *pN = &n, *pM = &m;

t = *pN;
*pN = *pM;
*pM = t;

return 0;
}

03. 구조체
*분할 정복이라는 개념에 따라 작은 것을 먼저 만들고, 큰 것은 단순히 만들어 놓은 작은 것을 합치는 방법을 택했습니다.

char pNameBank[20], pNameInsurance[20];
int nBirthBank, nBirthInsurance;
int genderBank, genderInsurance;
int nPhoneBank, nPhoneInsurance;
작명하기 힘들다.

변수 이름을 짓는 규칙
이름은 반드시 영어 단어로만 짓고 약어를 사용할때는 모든 프로그래머가 공통적으로 사용하는 약어를 씁니다. 혹시라도 자신만의 약어를 썻다면 코드 위쪽에 어떤 약어인지 표기하는것이 좋습니다. 더불어 최소 두개 이상의 단어를 연결하는것이 좋습니다.

ㅇ 구조체 자료형의정의
변수이름을 길게 만든것이 입력하에 불편을 초래하고, 그런 불편이 어쩔수 없는것이라면 더 좋은 해결책이있습니다. Bank와 Insurance라는 상자를 마든 다음에 해당 변수를 넣어두는 것입니다. 통장 개설을 하는중이라면 Bank, Insurance라는 상자를 마든 다음에 해당 변수를 넣어두는 것입니다. 통장 개설을 하는 중이라면 Bank 상자에서 꺼내고, 보험에 가입하는 중이라면 Insurance 상자에서 꺼냅니다. 이러한 개념을 구체적으로 표현한 것이 구조체 입니다.

구조체는 기존에 있던 변수를 없애서 메모리를 적게 사용하도록 하는 기술이 아닙니다. 단순히 변수의 위치를 상자 안으로 옮겨 놓은 것 뿐입니다. 변수들은 각각의 상자 안에 들어갔기 때문에 변수 이름에 붙였던 Bank와 Insurance 접미사는 필요없습니다. 따라서 변수 이름은 예전처럼 pName, nBirth등으로 사용할수 있습니다.
구조체를 사용하기 위한 상자를 만들어 봅시다. 첫번째로 통장 개설과 보험 가입을 처리하기 위한 구조체 상자를 다음처럼 정의합니다.
struct BANK{
char pName[20];
int nBirth;
int gender;
int nPhone;
};

struct INSURANCE{
char pName[20];
int nBirth;
int gender;
int nPhone;
}

먼저 만들었던 코드를 복사해서 중괄호 안쪽에 넣었습니다. BANK와 INSURANCE안쪽에 들어가는 변수가 오나전히 똑같습니다. struct 키워드는 상자를 뜻하기 때문에 구조체를 정의할때마다 반드시 맨 앞에 나와야 합니다. struct 다음에는 상제에 붙은 이름이 나옵니다. 첫번째 상자는 BANK라는 이름을 가졌고, 두번째상자는 INSURANCE라는 이름을 가졌습니다. 관용적으로 구조체 상자의 이름은 모두 대문자로 짓습니다. 그래서 프로그램에서 대문자로 표현된 이름을 보면, 상수 또는 구조체라고 생각하면 됩니다. 코드의 가독성을 높이기 위한 규칙입니다. 참, 구조체 정의 마지막에 문장의 끝을 알리는 세미콜린이 있습니다.

맴버 : 구조체 정의에 포함된 변수들을 맴버라고 합니다. 변수는 메모리에 할당된 객체를 가리키고, 멤버는 할당되기전의상태를 가리킵니다. 구조체 또한 사용하기위해서는 변수처럼 선언되어야 하는데, 멤버가 메모리에 할당되는 시점이 구조체 변수를 선언할때 입니다. 그ㅐ서 메모리에 할당된 변수하고 개념적으로 존재하는 변수를 구분하기 위해 맴버라는 이름이  추가되었습니다.

ㅇ구조체 변수 선언
상자, 다시말해 구조체를 정의하고 나면 새로운 자료형을 하나 갖는 셈이 됩니다. 다른사람들은 사용자 정의자료형이라고 합니다. 정해진 형태를 갖는 것이 아니라 필요에 따라 여러 자료형을 결합하기 때문입니다. 이제 새로운 자료형을 가졌으므로, int 자료형처럼 사용하는 일만 남았습니다.
BANK구조체는 네개의 변수를 모두 갖고 있어야 하기 때문에, 크기는 pName(20) + nBirth(4) + gender(4) + nPhone(4) 이 됩니다. 모두 32바이트를 사용합니다.

ㅇ구조체 변수 초기화
데이터 하나를 저장하기 위해서는 세개의 숫자가 필요하다 했고, 변수 선언에서 하나를 빠뜨렸습니다. char나 int와 같은 자료형을 기본 자료형 또느 ㄴ내장 자료형이라고 합니다. 구조체 처럼 정의하지 ㅇ낳고도 사용할수 있는 가장 기본이 되는 자료형이란 의미입니다. 기본 자료형에 대해서는 초기 값을 주는 것이 쉽습니다. 단순히 = 연산자를 쓰고 오른쪽에 필요한 값을 놓으면 됩니다. 그러나 구조체는 단순하지 않습니다. 구조체는 여러개의 맴버로 이루어 지기 떄문에 여러개의 값이 필요합니다. 다라서 구조체의 초기화에서는 전체가 하나라는 의미를 주는 중괄호를 사용해서 초기값을 설정합니다.

struct BANK bank ={“홍길동”, 1255, 0, 12345678};
= 연산자 오른쪽에는 값이 하나만 올수 있다는 문법을 따르면서, 여러개의 값을 넘겨 주고 있습니다. 그러나 이런 문법은 구조체 변수를 선언할때만 허용되고 다른 곳에서는 허용되지 않습니다.

일부만 초기화 시킬경우 다음처럼 코딩합니다.
struct BANK bank ={“홀길동”, 1255};
그러나 pName과 gender맴버에만 값을 주는것은 불가능 합니다.
왜냐하면 처음의 주소값만 가지고 있기 때문에…

ㅇ 구조체 멤버에 접근 – 점(.) 연산자
struct BANK bank;
printf(“%d”, bank.nVirthBank);
printf(“%d”, bank.genderBank);

ㅇ 구조체와 비슷한 주변 사물
구조체라는 것은 메모리를 덜 사용하거나 하는 것이 아니라 어질러져 있는 변수를 정리하게 해줍니다. 정리 해두었기에 찾을때는 플라스틱 상자 또는 책꽂이처럼 어떤 상자인지 어떤 책꽂이 인지 구분하는 것은 너무 당연합니다.

ㅇ 구조체의 목적 – 세상을 있는데로 구현
* C언어를 처음 배울때 사부님께서 말씀하셨습니다. “언어는 우리가 살고 있는 실제 세상을 표현할수 있어야 한다.”고 말입니다.

ㅇ구조체 변수 이름은 메모리에 할당된 시작 주소
구조체 변수는 메모리에 할당된 시작 주소를 가리킵니다. 구조체 전체를 하나의 자료로 본다면, 지금처럼 같은 상자 안에 모든 맴버가 들어가는 것이 좋습니다. 변수 이름은 데이터가 저장된 메모리의 시작 주소를 가리키기 때문에 구조체라는 편견만 버리면 시작 주소라고 쉽게 생각할수 있을겁니다.

구조체 기초 예제
#include<stdio.h>
struct BANK
{
int nBirth;
int gender;
int nPhone;
};
int main()
{
struct BANK bank = {1225,0,12345678};
printf(“생일 : %d”, bank.nBirth);
printf(“성별 : %d”, bank.gender);
printf(“전화 : %d”, bank.nPhone);
return 0;
}
구조체 맴버를 사용할때의 자료형은 오른쪽의 맴버가 결정하므로, 모든 맴버의 자료형은 int 입니다. int 자료형을 10진수로 출력하기위해 %d 타입을 사용했습니다.

ㅇ 함께 선언된 구조체 변수들의 초기화
struct Bank Wooribank  = {1255, 0, 1234565},
HanaBank = {1003, 0, 4234111},
KookminBank = {229, 0, 239723};

struct Bank Wooribank =  {1255, 0, 1234565},
HanaBank,  //초기화 안했기때문에 쓰레기값
KookminBank{0};

#include<stdio.h>
struct BANK
{
int nBirth;
int gender;
int nPhone;
};
int main()
{
struct BANK bank = {1225,0,12345678};
printf(“생일 : %d”, bank.nBirth);
printf(“성별 : %d”, bank.gender);
printf(“전화 : %d”, bank.nPhone);
return 0;
}

scanf 함수는 매개변수로 주소를 요구하기 떄문에, 변수 왼쪽에 & 연산자를 붙여서 사용해야 문제가 없습니다. 여기서 말하는 변수는, 구조체 전체를 가리키는 변수가 아니라 구조체에 포함된 맴버 각각을 가리키는 변수를 말합니다.

ㅇ이전까지 배웠던 구조체의 요약
1. 구조체는 여러개로 나뉜 변수들을 상자에 모아놓은 것이므로, 메모리의 사용량에는 변화가 없습니다.
2. 구조체 전체가 아닌 각각의 맴버에 대해 작업이 발생합니다.
3. 맴버 각각에 대한 작업은 지금까지 다뤘던 기본 자료형을 다루는 방법과 같습니다.
4. 맴버에 접근하기 위해서는 상자에 손을 넣어야 하므로, 구조체 변수이름과 점 연산자를 함께 사용합니다.
5. 점 연산자의 왼쪽에는 구조체 변수이름, 오른쪽에는 맴버 이름이 와야 합니다.
6. amin 함수 위쪽에 나오는 구조체의 정의는 메모리를 할당하는 작업이 아닙니다.
7. = 연산자를 선언되지 않은 구조체 맴버에 대해 사용할수 없습니다.
8. 구조체 크기가 필요한 경우에는 언제든 sizeof 연산자를 사용합니다.
9. 구조체 자료형에는 상자를 뜨하는 struct 키워드가 포함됩니다.
10. 구조체 변수 이름은 메모리에 할당된 구조체의 시작 주소를 가리킵니다.
11. 맴버 이름은 메모리에 할당된 맴버의 시작 주소를 가리킵니다.
12. 맴버의 주소는 구조체 변수를 선언한 경우에만 유효합니다.
13. 구조체 자료형은 점 연산자의 오른쪽에 나오는 맴버가 결정합니다.
14. 구조체 변수도 주소, 크기, 값의 숫자 세개를 갖고 있습니다.
15. 구조체는 자료형에 지나지 않기 때문에 int 자료형처럼 사용할수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.