모든 메모리는 그 주소를 가지고 있다. (하드웨어의 구조이다.)
변수는 메모리를 바이트 단위로 몇 단위씩 할당하게 된다.
이 때 가장 첫번째로 할당되는 대표 메모리의 주소를 변수가 가지게 된다.

변수 이름의 앞에 &(엠퍼센드)를 결합시키면 그 변수의 주소값을 반환한다.

포인터 변수는 일반적으로 그 타입이 정해져있다. 서수와 같은 타입으로써.
32비트 운영체제 환경에서는 그 크기가 4바이트라고 한다.

포인터 변수를 선언한다.
type* p;

type은 주소값에 대응할(포인터 변수가 가리킬) 변수의 타입을 적는다.
// 이는 다시말해 포인터로 호출할 때 가져올 타입(, 즉 크기, 단위)을 의미한다.


포인터 변수에는 주소값 및 가리킬 변수의 크기가 저장된다. 또한 *와 결합하는 기능도 가지고 있다.
*와 결합한 포인터 변수는, 주소값이 가리키는 변수를 반환(의미)하게 된다.

(변수를 정의할 때 사용되는 *를 제외한 모든 *는 포인터가 가리키는 변수를 호출(의미)하기 위한 것이다.)


Posted by 망고스파게티 :

구조체 변수란 변수의 집합체라고 볼 수 있다.

다음과 같이 구조체를 정의하고 구조체 변수를 선언했을 때,

struct infoName
{
type Name1;
type Name2;
...
};

infoName NameA1;
infoName NameA2;

NameA1 내에 있는 변수 Name1을 지칭하는 이름은 다음과 같다.

NameA1.Name1


구조체의 초기화는 변수를 정의할 때 말고는 불가능하다.

infoName NameA3 = { ~, ~, ...}
이렇게 하면 구조체 정의 내에 선언된 순서대로 대입되어 초기화된다.

구조체의 대입

구조체 타입이 같은 두 구조체 변수는 서로 대입할 수 있다. 행렬의 덧셈 대응 원리와 비슷하다.
Posted by 망고스파게티 :
ref> 앞으로는 한글을 모두 붙여써서 하나의 단위(요소)임을 나타내기도 하겠다.(예를 들어 '구조체의이름'과 같이)
/* 구조체의 선언 */

struct 구조체의이름
{
type Name1;
type Name2;
...
};

구조체의이름 NameA1;
구조체의이름 NameA2;

위와 같이, 구조체는 하나의 타입이 되고 또한 그러한 타입의 변수를 생성(선언)할 수 있다. 그 변수를 '구조체 변수'라 한다.

메인함수 바깥쪽에서 정의하는게 보통이지만 안에서 해도 된다.


구조체란 구조체 변수를 만들 때 필요한 설계도라고 볼 수 있다.
Posted by 망고스파게티 :


/* 배열의 선언 */
type name[N];
type은 배열의 원소들의 타입이다. name은 배열의 이름이다.
N은 배열의 크기라고 하고, 자연수이고 상수이어야 한다.
위의 선언은 다음과 같은 변수들을 만들어 낸다.
name[0], name[1], ... , name[N-1]
대괄호 내에 있는 값들을 일컬어 인덱스라 한다.
변수를 불러내기 위해 인덱스 내에 또다른 변수가 들어갈 수 있다.

/* 배열의 초기화 */
배열의 초기화는 배열을 선언하는 문장 내에서만 가능하다.
type name[N] = { ~ } ;
또, 배열 간의 대입은 불가능하다. 또한, 배열을 초기화해줄 때, 배열의 크기를 적지 않는 경우 초기화 내용에 따라서 자동으로 크기가 지정된다.
문자열을 이용하여 초기화 할 수도 있다.
type name[] = "~";
물론 이는 ~의 내용을 모두 적은 뒤 NULL문자까지 마지막으로 저장하기 때문에 ~에 있는 글자 개수보다 하나 많은 개수의 원소를 가진다. cout객체를 통한 출력을 위해서는 필수인 것이 NULL이다. NULL은 출력 시 아무것도 출력되지 않는다.

/*배열의 원소의 개수*/
또한 sizeof(배열의 이름)/sizeof(name[0]) 를 이용해 배열의 원소의 개수를 구할 수 있다.

/*cout<<배열의이름; */
cout 객체를 통해 출력을 할 때,
 
cout << 배열의 이름
을 하면 원소가 차례대로 출력된다.

/* 문자열의 소개 */
문자열이란 마지막에 NULL문자가 위치하는 char타입(형) 배열이다.
cout 객체가 처리하는 char형 배열의 출력방식은, NULL(\0)이 나올 때 까지 배열의 원소(문자변수)를 반복 출력하는 것이다.
다음을 문자열 상수라 한다.
"문자열"

Posted by 망고스파게티 :

break;는 모든 중괄호에 대해서 오른중괄호 다음으로 벗어나도록 하는 역할을 한다.
(블럭 밖으로 빠져나와 다음 흐름으로 간다.) 가 아닌 것 같네...

하나의 제어구조를 빠져나와 그 다음 흐름으로 간다.

흠... 뭐라 정리해야하나.
continue;는 반복문에서, 흐름을 다음 번 반복으로 이동시킨(건너뛴)다.
Posted by 망고스파게티 :

while(A){ ~ }

A가 참(true, 1, NOT 0 )이면 ~를 실행하고 다시 A로 되돌아온다.
A가 거짓(false, 0 )이면 ~를 실행하지 않고 건너뛰어 다음 흐름으로 넘어간다.

do{ ~ } while(A);
이는 { ~ } while(A){ ~ } 과 똑같은 것이다.
~를 실행한다.
~를 실행했을 때, A가 참이면 ~를 실행하고 A가 거짓이면 다음으로 넘어간다.

for(A;B;C){ ~ }
제일 처음에 A를 실행하고, B가 참이면 ~를 실행하고 그 후 C를 실행한다.
B가 거짓이면 다음 흐름으로 넘어간다.
C를 실행했을 때 B가 참이면 ~를 실행하고 그 후 C를 실행한다.
C를 실행했을 때 B가 거짓이면 다음 흐름으로 넘어간다.

Posted by 망고스파게티 :

X ? A : B;

조건 X가 참이면 앞의 것(A), 아니면 뒤의 것(B)을 실행한(가진)다.

goto X;
X:

goto X;에 진입하면 X:의 뒤로 이동한다.
Posted by 망고스파게티 :




우선, n비트 짜리 비트열(bit string) a에 대해 그 각각의 비트들을 a1, a2, ..., an이라 하자. 순서는 상관없으나, 일반적으로는 왼쪽부터 오른쪽으로 서수를 매긴 것으로 본다.

이제 임의의 비트 수가 같은 두 비트열 A, B에 대해,
AND OR XOR NOT 연산을 해보자.

A&B == (A1&B1)(A2&B2)...(An&Bn)
A|B == (A1|B1)(A2|B2)...(An&Bn)
A^B == (A1^B1) ... (An&Bn)
~A == (~A1)(~A2)...(~An)

단, ~1 = 0, ~0 = 1
1&1 = 1, 1&0, 0&1, 0&0 = 0
0|0 = 0, 0|1, 1|0, 1|1 = 1
1^1, 0^0 = 0 , 1^0, 0^1 = 1
이와 같다. 그럼 조금 더 정리해보자.
눈썹연산(XOR)에 대해서...

A^B의 비트 중, 값이 1인 임의의 비트의 서수를 d라 하자.
또한 값이 0인 임의의 비트의 서수를 s라 하자.
그러면
Ad^Bd = 1 = Cd
As^Bs = 0 = Cs
라 하면
Cd와 Ad의 관계는 다음과 같다.
Ad가 1이면 Ad^Cd = 0, Ad가 0이면 Ad^Cd = 1
Cs와 As의 관계는 다음과 같다.
As가 1이면 As^Cs =  1, As가 0이면 As^Cs = 0

따라서 A^C는 Ai == Bi인 비트들, 즉 As를 그대로 갖고, 그 외 Ai != Bi인 비트들, 즉 Ad는 그 반대인 Bd로 바뀌게 된다.
그러므로 그 결과는 B와 일치한다.

따라서 다음과 같은 성질이 증명되었다.
A^(A^B) = B


쉬프트 연산자.

A가 A1A2...An일 때,
A>>1는 AnA1A2...A(n-1)과 같다.
A<<1은 A2A3...AnA1과 같다.

A>>N은 for(int i=0;i<N;i=i+1;){A = A>>1}에서의 A와 같다.
다시말해, A>>N은 (A>>(N-1))>>1과 같다.

A<<N은 for(int i=0;i<N;i=i+1;){A = A<<1}에서의 A와 같다.
다시말해, A<<N은 (A<<(N-1))<<1과 같다.

Posted by 망고스파게티 :

switch(N)
{
        case N1:
                ~
                break;
        case N2:
                ~
                break;
.
.
.
        case Nn:
                ~
                break;
        default:
                ~
}

흐름이 switch에 도달하면 N의 값과 같은 Ni의 값을 찾는다. (i = 1, 2, ... , n)
(단, Ni는 상수이다.)
그리고 흐름은 'case Ni:' 의 바로 뒤의 위치로 간다.
그러다가 다음 case문인 'caseN(i+1):' 을 만나면 그 바로 뒤로 간다.
하지만 'break'를 만나면 switch(){} 의 바로 다음 위치로 탈출한다.

모든 case에 해당되지 않는 경우 default로 이동한다. 하지만 default 역시 break가 내장되어 있는 것은 아니다. 그러나 마지막에 위치한다면 break문은 필요하지 않다.

대부분 switch/case문을 어느 하나의 경우만을 실행하는 데 쓴다. 그게 일반적이다. 하지만 어떻게 다르게 이용해볼 수도 있을 것이다.

참고/ case, default과 같은 것과 그에 해당하는 실행코드 부분 합쳐 블럭이라고 한다...(?)
Posted by 망고스파게티 :


if(X){~} : X의 값이 0이 아니면 '~'를 실행한다. 0이면 실행하지 않는다.

else {~} : 같은 중괄호 깊이(안)에 존재하는, 마지막으로 시행된 if문의 조건의 여집합 조건을 가진 if문과 똑같다.

else if(X){~} : else { if(X){~} }와 같다. 나같으면 차라리 안쓰겠다. 쓸데없이 따로 얘기해가지고. 어떤 병신이... 차라리 비축약형을 먼저 설명하고 그 축약형을 소개하던가.

위 세 가지 모두, ~가 한문장일 경우 {}를 벗겨도 무방하다.

Posted by 망고스파게티 :