C++ 에서 ^ ??

기초 2020. 11. 11. 15:14

directX 예제 코드를 보다가 

IFrameworkView^ Direct3DApplicationSource::CreateView()

 

이렇게 되어있는 코드가 있었다.

^(hat 이라 부른다)의미를 찾아보니 대충 스마트 포인터와 같은 의미인 것 같다.

 

공식 내용

docs.microsoft.com/en-us/cpp/extensions/handle-to-object-operator-hat-cpp-component-extensions?view=msvc-160

 

Handle to Object Operator (^) (C++/CLI and C++/CX)

Handle to Object Operator (^) (C++/CLI and C++/CX) In this article --> The handle declarator (^, pronounced "hat"), modifies the type specifier to mean that the declared object should be automatically deleted when the system determines that the object is n

docs.microsoft.com

ref new, gcnew 관련 ( ref new, gcnew 으로 생성(?) 시 ^ 형으로 반환된다는것 같다.)

docs.microsoft.com/en-us/cpp/extensions/ref-new-gcnew-cpp-component-extensions?view=msvc-160

 

ref new, gcnew (C++/CLI and C++/CX)

ref new, gcnew (C++/CLI and C++/CX) In this article --> The ref new aggregate keyword allocates an instance of a type that is garbage collected when the object becomes inaccessible, and that returns a handle (^) to the allocated object. All Runtimes Memory

docs.microsoft.com

 

'기초' 카테고리의 다른 글

C++ :: 의미  (0) 2020.07.20
간단히 적어놓는 논리연산자  (0) 2017.02.09
운영체제 스케줄링 기법  (0) 2016.10.20
까먹지 말자  (0) 2016.08.16
Hello world  (0) 2016.08.11
posted by 알쿠미

C++ :: 의미

기초 2020. 7. 20. 21:00

:: 는 "범위 지정 연산자"이다.

ClassName::

NameSpaceName::

::

사용하는 방법은 위에 가지가 있다.

class Name
{
    public:
    void Print();
};

void Name::Print()
{
}

 

위에 Name::Print()를 써서 Class Name안에 있는 함수에 접근해서 선언할 수 있다.

 

namespace a
{
    void Print()
    {
    }
}

namespace b
{
    void Print();
    {
    }
}

a::Print() - a NameSpace 범위의 Print()

b::Print() - b NameSpace 범위의 Print()

는 다른 의미가 된다.

 

* 그냥 :: 만 사용하게 되면

현재 존재하는 모든 전역변수와 전역함수들을 지역변수, 지역함수와 구분지어 사용할 수 있게된다.

 

사용자가 정의한 전역함수도 ::를 사용하여 호출 할 수 있다.

 

출처: https://xxxq.tistory.com/entry/c%EC%97%90%EC%84%9C-%EC%9D%B4-%EA%B8%B0%ED%98%B8%EC%9D%98-%EC%9D%98%EB%AF%B8

'기초' 카테고리의 다른 글

C++ 에서 ^ ??  (0) 2020.11.11
간단히 적어놓는 논리연산자  (0) 2017.02.09
운영체제 스케줄링 기법  (0) 2016.10.20
까먹지 말자  (0) 2016.08.16
Hello world  (0) 2016.08.11
posted by 알쿠미

간단히 적어놓는 논리연산자

기초 2017. 2. 9. 17:19

NOT ~a : a가 true이면 ~a는 false


AND(논리곱) a & b 둘다 true일때 true


OR(논리합) a | b 하나만 true여도 true


XOR(베타적 논리합) a ^ b 하나만 true 일때 true

'기초' 카테고리의 다른 글

C++ 에서 ^ ??  (0) 2020.11.11
C++ :: 의미  (0) 2020.07.20
운영체제 스케줄링 기법  (0) 2016.10.20
까먹지 말자  (0) 2016.08.16
Hello world  (0) 2016.08.11
posted by 알쿠미

운영체제 스케줄링 기법

기초 2016. 10. 20. 23:54

1. 비선점 스케줄링

- 할당된 CPU를 다른 프로세스가 강제로 빼앗을 수 없는 기법

- 필요성이 떨어지는 긴 프로세스가 선점하고 있을 때 기다리는 점이 발생

- 종류 : FCFS(FIFO), SJF(Shortest Job First), HRN, 기한부(DeadLine)


2. 선점 스케줄링

- 할당된 CPU를 다른 프로세스가 강제로 뺴앗아 사용할 수 있는 기법

- 빠른 응답시간을 요구하는 시분할 시스템에 사용

- 많은 오버헤드

- 인터럽트용 타이머 클럭필요( 프로세스가 자원을 독점하는 것을 방지)

- 종류 : RR(Round Robin, SRT, 선점 우선순위, 다단계 큐(MQ), 다단계 피드백 큐(MFQ)


3. 비전섬 스케줄링 종류

* FCFS( first Come First Service, 선입선출)

- 준비 상태 큐에 도착한 순서에 따라 차례로

* SJF 짧은 작업 우선

- 평균 대기시간이 가장 짧다.

- 실행시간이 긴 프로세스는 무기한 연장될 수 있다.

* HRN( Highest Response-ratio Next )

- SJF 기법의 보완

- 우선순위 공식을 이용해서 실생 시간이 짧은 프로세스나 대시시간이 긴 프로세스에게 우선 순위를 줌

- 우선순위 계산식 = ( 대기시간 + 실행시간 ) / 실행시간

* 기한부 ( Deadline )

- 일정시간동안 프로세스를 완료하는 기법

- 제한된 시간안에 프로세스들이 동시에 실행되면 스케줄링이 복잡해지며 실행시 직중적으로 요구되는 자원관리에 오버헤드가 발생한다.

* 우선순위 ( Priority )

- 프로세스마다 우선순위 부여

- 우선순위가 동일한경우 FCFS 기법으로 할당

- 가장 낮은 순위를 부여받은 프로세스는 무한 연기 또는 기아상태가 발생할 수있다.


4. 선점 스케줄링 종류

* Round Robin

- 시분할 시스템을 위해 고안한 방식, FCFS기법의 변형

- 각 프로세스는 시간 할당량 동안만 실행한 후 완료되지 않으면 다음 프로세스에게 CPU를 넘겨주고 준비상태 큐의 가장 뒤로 배치

- 할당된 시간이 클수록 FCFS와 같다

- 시간이 작을 수록 문맥교환과 오버헤드가 자주 발생


* SRT( Shortest Remaining Time )

- SJF기법의 번형

- 실행중인 프로세스의 남은 시간과 준비상태 큐에 새로 도착한 프로세스의 실행 시간을 비교하여 짧은 실행 시간을 요구하는 프로세스에게 CPU를 할당

- 준비상태 큐에 있는 프로세스의 실행 기간 추적으로 오버헤드 증가

* 다단계 큐

- 프로세스를 특정 그룹으로 분류할 수 있을 경우 그룹에 따라 각기 다른 준비단계 큐 사용

- 시스템, 대화형, 편집, 일괄처리 프로세스 등으로 분류

- 준비상태 큐마다 다른 스케줄링 기법 사용가능

- 다른 준비상태 큐로 이동 불가

- 하위 단계 준비큐에 있는 프로세스를 실행하는 도중이라도 상위 단계 준비상태 큐에 프로세스가 들어오면 상위단계 프로세스에게 CPU 할당


* 다단계 피드백 큐

- 다단계 큐 기법 개선하여 다른 준비상태 큐로 이동가능

- 각 큐마다 시간 할당량부여 시간동안 완료 되지 못한 프로세스는 다음 단계 큐로 이동

- 마지막 단계 큐에서는 RR스케줄링으로 할당


에이징(aging) = 시간이 지날수록 우선순위를 높혀주는것


참고 : http://visu4l.tistory.com/184

'기초' 카테고리의 다른 글

C++ :: 의미  (0) 2020.07.20
간단히 적어놓는 논리연산자  (0) 2017.02.09
까먹지 말자  (0) 2016.08.16
Hello world  (0) 2016.08.11
typedef 관련  (0) 2016.05.22
posted by 알쿠미

까먹지 말자

기초 2016. 8. 16. 18:29

mutual == const가 붙어있는 함수에서도 값을 바꿀 수 있는 키워드


unsigned 숫자 옆엔 u를 붙이자. 1u , 2u이렇게

'기초' 카테고리의 다른 글

간단히 적어놓는 논리연산자  (0) 2017.02.09
운영체제 스케줄링 기법  (0) 2016.10.20
Hello world  (0) 2016.08.11
typedef 관련  (0) 2016.05.22
using 키워드  (0) 2016.03.02
posted by 알쿠미

Hello world

기초 2016. 8. 11. 17:28

cout 은 클래스다

<< 는 왼쪽 시프트 연산자

cout에서는 추출연산자.


문자와 문자열


문자는 1byte짜리 한글자

한글은 아스키 코드에 있지 않으므로 문자가 아니다.


유니코드 = 모든 글자를 2byte로 해뒀다.


2byte 이상은 문자열


문자는 'a' 문자열은 "a"


'\0' 는 문자 -> 이스케이프 문자열 이걸 만나면 문자열의 끝이다.


endl 은 함수 호출이다.


상수 - 변하지 않는 숫자


함수의 상수화

내가 만들어 놓은 함수를 바꾸지 않겠다.


변수 - 변할 가능성이 있는 숫자

정수 ( 양수 , 0 , 음수 ) 숫자의 크기가 정해져있다. 그 용량 만큼 변수를 사용하겠다는 의미

실수 - 양수 + 부호비트

문자열


자료형

char (1byte) 아스키 코드와 매칭되어있어서 숫자를 문자로 인식한다.

-128 ~ 127 / 0 ~ 255

short (2byte) 65536 개 0 ~ 65535 개 __int16

int (4byte) int가 4byte가 아닐때가 있었어서 long이랑 크기가 같다. __int32

long (4byte) __int32

long long (8byte) __int64


bit는 컴퓨터가 연산하는 단위 2의 제곱

byte 사용자가 저장하는 단위 2의 3제곱


unsigned 는 양수만 쓸때 정수형 자료형에만 쓸 수 있다.


실수 자료형

float (4byte) 2byte는 정수 2byte는 실수 / 소수점 이하 6~7자리

double (8byte) 4byte는 정수 4byte는 실수 / 소수점 이하 12~15자리


컴파일러에 따라서 유효숫자 갯수가 정해진다.


float a = 3.14; 실수를 발견하면 double로 간주한다.

그래서 경고가 뜬다. 8byte를 4byte로 바꾸는 것이기 때문에 그래서 3.14f를 사용해서 3.14f 0.f 이렇게 알려줘야한다.


char 65번 = A 97번 = a


bool (1byte) 저장하는 단위가 1byte부터이기 때문에 0이 아니면 다 1





'기초' 카테고리의 다른 글

운영체제 스케줄링 기법  (0) 2016.10.20
까먹지 말자  (0) 2016.08.16
typedef 관련  (0) 2016.05.22
using 키워드  (0) 2016.03.02
시스템  (0) 2016.01.18
posted by 알쿠미

typedef 관련

기초 2016. 5. 22. 16:28

typedef의 일반적인 형식

typedef old-name new-name;


typedef의 사용이유는

1. 여러 시스템 환경에서 사용할 수 있는 프로그램을 만들기 위해서

(변수를 재선언해서 시스템 환경에 맞는 변수와 매칭해주기 위해서)

2. 복잡한 선언 (#define과 비슷한 점)

하지만 다른점

typedef char *STRING;

#define STRING char*

STRING name, sign을 선언했을 때

typedef 는 *name, *sign이 되지만

#define은 *name, sign이 된다.


typedef char (*FRPTC())[5];

FRPTC를 char형 5개짜리 배열을 가리키는 포인터를 이턴하는 함수의 데이터형으로 만든다.


변경자의 의미

* 포인터를 나타낸다.

() 함수를 나타낸다.

[] 배열을 나타낸다.


int board[8][8]; //int형 배열의 배열

int **ptr;         //int형을 가리키는 포인터를 가리키는 포인터

int *risks[10];   //int형을 가리키는 10개짜리 배열

int (*rusks)[10]; // int형 10개짜리 배열을 가리키는 포인터

int *oof[3][4];  // int형을 가리키는 포인터들의 3*4배열 

int (*uuf)[3][4]; // int형 3*4배열을 가리키는 포인터

int (*uof[3])[4]; // int형 4개짜리 배열을 가리키는 포인터 [3]배열


1.배열을 나타내는 []과 함수를 나타내는()는 우선순위가 같다. 이들은 간접 연산자*보다 우선순위가 높다.

그렇기 때문에 int *risks[10]은 포인터들의 배열이 된다.


2. []과 ()는 왼쪽에서 오른쪽으로 결합한다.

int goods[12][50]은 50개짜리를 담고있는 12개짜리 배열이 된다.


3. []과 ()는 우선순위가 같다. 그러나 왼쪽에서 오른쪽으로 결합하기 때문에

int (*rusks)[10]은 int형 10개짜리 배열을 가리키는 포인터가 된다.


char *fump(); // char형을 가리키는 포인터를 반환하는 함수

char (*fump)(); // char형을 리턴하는 함수를 가리키는 포인터

char (fump[3])(); // char형을 리턴하는 함수를 가리키는 3개의 배열



출처 : http://itbrain.tistory.com/entry/typedef%EC%9D%98-%EC%82%AC%EC%9A%A9

http://yatoyato.tistory.com/783

'기초' 카테고리의 다른 글

까먹지 말자  (0) 2016.08.16
Hello world  (0) 2016.08.11
using 키워드  (0) 2016.03.02
시스템  (0) 2016.01.18
함수 포인터  (0) 2015.12.22
posted by 알쿠미

using 키워드

기초 2016. 3. 2. 20:04


'기초' 카테고리의 다른 글

Hello world  (0) 2016.08.11
typedef 관련  (0) 2016.05.22
시스템  (0) 2016.01.18
함수 포인터  (0) 2015.12.22
포인터 보충  (0) 2015.12.22
posted by 알쿠미

시스템

기초 2016. 1. 18. 04:18

유저영역

전역변수, static변수의 할당을 위해 존재하는 Data영역

지역변수 할당과 함수 호출시 전달되는 인자값들의 저장을 위해 존재하는 Stack 영역

동적 할당을 위해 존재하는 Heap영역으로 구성된다.

실행파일을 구형하는 명령어들이 올라가는 메모리 영역을 Code영역


Context Switching

Register Set - CPU 내에 존재하는 레지스터들은 현재 실행 중인 프로그램을 위한 데이터들로 채워진다.

그러므로 프로세스가 바뀔 때 현재 레지스터들이 가지고 있는 데이터들을 어딘가에 저장해야 한다.

Context Switching 할 때는 CPU가 아무것도 하지 못하기 때문에 부하가 많이 된다.

"실행되는 프로세스의 변경과젱에서 발생하는 컨텍스트 스위칭은 시스템에 많은 부담을 준다."


커널 오브젝트와 오브젝트 핸들

"커널에서 관리하는 중요한 정보를 담아둔 데이터 블록을 가리켜 커널 오브젝트라 한다."

프로세스가 생성될 때마다 PCB 변수가 하나씩 생성되고, 새롭게 생성된 프로세스 정보들로 초기화 되는데, 이 것이 바로 커널 오브젝트의 정체 이다.


프로세스 뿐만 아니라 쓰레드를 생성할때에도, IPC를 위해 사용되는 파이프나 메일슬롯을 생성할 때에도 커널오브젝트를 생성해서 필요한 정보들을 채워야 한다.


커널오브젝트에 할당되는 숫자! 핸들(Handle)

우선순위는 커널오브젝트에 저장된다.

커널오브젝트를 가리키기 위해서는 핸들을 이용한다.

Windows는 커널오브젝트를 생성할 때 마다 핸들이라는 정수값을 하나씩 부여한다.


"커널 오브젝트는 Windows 운영체제에 종속적이다."

커널 오브젝트는 프로세스에 종속적인 것이 아니라, 운용체제에 종속적인 관계로 커널 오브젝트의 소멸 시점은 운영체제에 의해서 결정된다.


커널 오브젝트는 프로세스에 종속적인 것이 아니라 운영체제에 종속적인 관계로 여러 프로세스에 의해서 접근 가능하다.


그러나 핸들은 운영체제에 종속적이 아니라 프로세스에 종속적이다.


usage count


CloseHandle

프로세스가 소멸된다고 해서 커널 오브젝트가 소멸된다고 할 수 없다.


프로세스는 각각 다른 메모리 공간을 가지고 있기때문에 서로 소통할 수 없다.

(메일 슬롯이나 파이프 사용)


Nonsignal - signal

커널 오브젝트가 생성되면 Non-signal 프로세스가 종료되면 Signaled가 된다.


핸들테이블 - 핸들 정보를 저장하고 있는 테이블로서 프로세스별로 독립적이다.


자식프로세스를 생성할 때 넘겨주는 인자에 따라 핸들테이블을 상속할 것인지를 결정할 수 있다.


자식프로세스와 부모프로세스는 각각 다른 메모리 공간을 사용하지만

프로세스와 쓰레드와는 스택영역만 다를분 다른 공간은 공유한다.


쓰레드의 특성

1. 스택을 독립적으로 할당받는다. ( 실행 흐름의 추가를 위한 최소 조건이 독립된 스택의 제공이다.)

2. 코드 영역을 공유한다. (쓰레드는 자신을 생성한 프로세스가 가지고 있는 함수를 호출할 수 있다.)

3. 데이터와 힘영역을 공유한다.(IPC가 필요 없다.)

 - 전역 변수와 malloc 함수를 통해서 동적 할당된 메모리 공간은 공유가 가능하다.


컨텍스트 스위칭이 빨라진 쓰레드

"공유하는 영역이 많아서 빠르다"


커널영역?

하나의 프로세스에게 할당된 총 메모리 공간 중에서 유저영역을 제외한 나머지 영역

운영체제라는 하나의 소프트웨어를 실행시키기 위해서 필요한 메모리 공간을 커널 영역이라 한다.


커널레벨 쓰레드, 유저레벨 쓰레드

프로그래머 요청에 따라 쓰레드를 생성 및 스케줄링하는 주체가 커널인 경우(커널쓰레드)

커널레벨 쓰레드 - 안전하고 기능이 많다 / 커널모드와 유저모드 전환이 빈번해서 느리다.


유저레벨쓰레드 - 전환이 없어서 성능이 좋다 / 프로그래밍하기 어렵고 결과예측이 어렵다.







'기초' 카테고리의 다른 글

typedef 관련  (0) 2016.05.22
using 키워드  (0) 2016.03.02
함수 포인터  (0) 2015.12.22
포인터 보충  (0) 2015.12.22
포인터, 문자열  (0) 2015.12.21
posted by 알쿠미

함수 포인터

기초 2015. 12. 22. 17:07
1
2
3
4
int add(intint);
int (*padd)(intint); // 함수 포인터 초기화
 
padd = add; // 함수 포인터 대입
cs

padd = &add 가 아니라 padd = add를 사용한다.

함수명은 수식 내에서 함수를 가리키는 주소로 자동 변환 되기 때문에 가능하다.


가리키고 있는 함수를 호출하는 방법


i = padd(5 ,4);

i = (*padd)(5, 4); // 이 방법도 가능하다.


2차원 함수 포인터도 가능하다.



'기초' 카테고리의 다른 글

using 키워드  (0) 2016.03.02
시스템  (0) 2016.01.18
포인터 보충  (0) 2015.12.22
포인터, 문자열  (0) 2015.12.21
int arr[2][3]의 대해서  (0) 2015.12.20
posted by 알쿠미

포인터 보충

기초 2015. 12. 22. 02:55

arr[i] ==  *(arr + i);

i[arr] ==  *(i + arr);


그러므로 []는 연산자이다.


피 연산자[피 연산자]

하나의 피 연산자는 기본 메모리 번지를 뜻하고

나머지 피 연산자는 기본 메모리 번지에서 얼마만큼 떨어져 있는지를 나타낸다.

정수는 피 연산자의 위치라면 어디에 있든지 상관 없다.


NULL문자 '\0' 과 NULL 포인트는 다르다.


NULL포인터는 에러를 처리할 때, 매개변수의 마지막을 알릴 때 사용한다.

'기초' 카테고리의 다른 글

시스템  (0) 2016.01.18
함수 포인터  (0) 2015.12.22
포인터, 문자열  (0) 2015.12.21
int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
posted by 알쿠미

포인터, 문자열

기초 2015. 12. 21. 01:14

'a' 는 문자 하나

"a" 는 맨뒤에 널문자가 들어있는 문자열

따라서

포인터 변수에는 "a"가 들어갈수 잇지만 'a'가 들어갈수 없고

char 변수에는 'a'가 들어갈수 있지만 "a"가 들어갈 수 없다.


1
2
3
char *string = "string"// 이 변수는 상수가 된다고 한다.

char string[] = "string" 
//위에 식은 string[1] 이런식으로 값에 접근해서 수정이 가능하다.
 
cs


은 엄연히 다르다.

배열과 포인터와 관계로 보면될듯하다.


포인터는 문자열의 가장 앞에 부분을 가리키고 있다고 보면 될듯 하다.

'기초' 카테고리의 다른 글

함수 포인터  (0) 2015.12.22
포인터 보충  (0) 2015.12.22
int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
posted by 알쿠미

int arr[2][3]의 대해서

기초 2015. 12. 20. 19:09



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    printf("%x %d\n", narr, sizeof(narr));
    // 배열명으로 가장 첫번째가 저장된 곳 배열의 전체를 가리키고 있는값
    // 출력 값 : 주소값 24(3*2*4)
    printf("%x %d\n"&narr, sizeof(&narr));
    //narr 이 가리키고 있는 주소값이고 위에 값이랑 같다. 그리고 가리키고있는 값이 주소값 따라서
    // 출력 값 : 주소값 4(가리키는 값이 아니라 그냥 주소값(포인터 크기)
    printf("%x %d\n", narr[0], sizeof(narr[0]));
    //narr[0]은 행을 대표하는 주소 값은 narr과 같다.
    // 출력 값 : 주소값(narr과 같다) 12(행을 대표하기 때문에(3*4))
    printf("%x %d\n"&narr[0], sizeof(&narr[0]));
    //2번의 결과와 같다.
    printf("%x %d\n", narr[1], sizeof(narr[1]));
    printf("%x %d\n", narr[2], sizeof(narr[2]));
    // 결과 값 : 주소값 12(행을 대표하기때문에)
 
    printf("%x %d\n"&narr[1], sizeof(&narr[1]));
    printf("%x %d\n"&narr[2], sizeof(&narr[2]));
    // 결과 값 : 주소값 4(주소크기)    
 
    printf("%x %d\n", narr[0][0], sizeof(narr[0][0]));
    printf("%x %d\n", narr[0][1], sizeof(narr[0][1]));
    //쓰레기값  4(가리키는 변수크기)
 
    printf("%x %d\n"&narr[0][0], sizeof(&narr[0][0]));
    printf("%x %d\n"&narr[0][1], sizeof(&narr[0][1]));
    //주소값  4(주소크기)
cs




'기초' 카테고리의 다른 글

포인터 보충  (0) 2015.12.22
포인터, 문자열  (0) 2015.12.21
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
posted by 알쿠미

포인터, 2차원 배열

기초 2015. 12. 19. 03:56

배열 포인터 정의

1
2
3
int    *nparr;                //1차원 배열 포인터
int    (*nparr2)[3];       //2차원 배열 포인터
int    (*nparr3)[2][3];  //3차원 배열 포인터
cs
위의 포인터들은 모두 4바이트이다. 2차원이라고 8바이트되는 것이 아니다.

컴파일러의 환경에 따라서 64비트면 포인터 크기는 8바이트라고 한다.

운영체제가 64비트라도 컴파일러가 32비트면 4바이트이다.

운영체제에서 32비트 호환을 지원하기 때문이라고 한다.

앞에 행이 몇개인지는 중요하지 않다.


1
2
3
4
5
6
7
8
9
10
11
int    narr[2];
int    *nparr;
 
cout<<sizeof(narr)<<endl;
cout<<sizeof(nparr)<<endl;
cout<<sizeof(*nparr)<<endl;
 
출력결과 : 
8
4
4
cs

narr의 크기는 배열 전체의 크기이므로 4*2 = 8 이고

nparr의 크기는 포인터이므로 4이고

*nparr의 크기는 가리키는 것에 대한 크기이다.


1
2
3
4
5
6
int    narr[3][2];
int    (*nparr)[2];
 
1) nparr = narr;
2) nparr = narr[0];
3) nparr = &narr[0][0];
cs

nparr은 배열을 대상으로 한 포인터 이기때문에 2), 번과 3)번과 같은 형태는 대입 되지 않는다.

2)번과 3번은 배열이라기 보다는 첫번째 값의 주소와 같은 개념이므로. 배열을 대상으로한 포인터가 아니다.


int narr[2][3] 이라는 것에서

sizeof(narr) == 2*3*4;

sizeof(narr[0]) == 3*4; // 행을 다 가르키기 때문에

엄연히 narr과 narr[0]는 다르다.


1
2
3
4
5
6
7
8
9
 
    int narr[2][3= {{1,2,3},{456}};
    int *nparr1;
    int (*nparr2)[3];
 
    nparr1 = &narr[0][0];
    nparr2 = narr;
 
    cout<<*(*(nparr2+1)+2)<<endl;
// 안에 덧셈은 행 증가 뒤에 덧셈은 열증가
cs

2차원 배열 포인터 대입 방법

nparr1 은 아무리 2차원 배열 처럼 더해도 1차원이라서 하나씩 증가된다.(배열의 끝까지 증가가능)

포인터는 계속 증가하면 배열의 끝까지 계속 갈수 있다.

2차원 배열 포인터는 증가하면 행이 증가된다.




'기초' 카테고리의 다른 글

포인터, 문자열  (0) 2015.12.21
int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
포인터 복습(&,*)  (0) 2015.12.18
posted by 알쿠미

포인터, 배열

기초 2015. 12. 19. 01:11

배열 초기화 방법

1
2
int  imsi[3= {0};// 1차원 배열 초기화
int  imsi[2][3= {{1,2,3}, {이부분은 0으로 초기화}}; //2차원 배열 초기화
cs


1
2
3
4
5
6
7
int    imsi[3= { 537};
int    *imsip;
 
imsip = imsi; 
 
1. 배열명은 주소를 뜻한다.
2. 배열명은 배열의 첫번째 배열요소의 주소를 뜻한다.
cs

따라서 imsi == &imsi[0] imsip는 imsi[0]를 가리키고 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
    int    imsi[3= { 537};
    int    *imsip;
 
    imsip = imsi;
 
    int a = *(imsi + 1);
    int b = *(imsip + 1);
 
    cout<<a<<endl;
    cout<<b<<endl;
cs

배열을 가리키는 포인터에 +1을 하면 다음 값을 가리킨다.
다음의 출력 값은 3이 2번 출력된다.

imsip++ 은 되지만 imsi++은 되지 않는다.(imsi는 변경할 수 없기 때문)
배열명에는 주소를 할당할 수 없다. 배열명은 포인터 변수가 아니라 배열명 자체일 뿐이다.








'기초' 카테고리의 다른 글

int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
포인터 복습(&,*)  (0) 2015.12.18
깊은 복사 / 앝은 복사  (0) 2015.12.07
posted by 알쿠미

포인터 기초(초기화 문제, 크기)

기초 2015. 12. 19. 00:18
1
2
3
4
5
    int *nptr;
    int a = 5;
 
    *nptr = 5// 초기화 되지않은 변수 오류
    *nptr = a; // 초기화 되지않은 변수 오류
cs

포인터는 주소를 지정하고 사용해야한다.

1
2
3
4
5
6
7
8
9
    int                 int_;         //4바이트
    float             float_;        //4바이트
    double         double_;    //8바이트
    char            char_;        //1바이트
 
    int                *intp;        //4바이트
    float            *floatp;    //4바이트
    double            *doublep;    //4바이트
    char            *charp;        //4바이트
cs


모든 포인터 변수는 4바이트를 가진다.

'기초' 카테고리의 다른 글

int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
포인터 복습(&,*)  (0) 2015.12.18
깊은 복사 / 앝은 복사  (0) 2015.12.07
posted by 알쿠미

포인터 복습(&,*)

기초 2015. 12. 18. 03:50
1
2
3
4
5
6
7
8
9
10
    int *nptr;
    int a = 5;
 
    nptr = &a;
 
    cout<<"&a : "<<&a<<endl;
 
    cout<<"nptr : "<<nptr<<endl;
    cout<<"&nptr : "<<&nptr<<endl;
    cout<<"*nptr : "<<*nptr<<endl;
cs

결과



&는 주소값

*는 가리키는값


포인터 변수에 주소값을 넣기 위해서 마련된 것이 &연산자이다.

'기초' 카테고리의 다른 글

int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
깊은 복사 / 앝은 복사  (0) 2015.12.07
posted by 알쿠미

깊은 복사 / 앝은 복사

기초 2015. 12. 7. 20:56

* 개요

 객체가 복사 된다는 것은 기존 객체와 같은 값을 가지는 새로운 객체를 만든다. 라는 것 객체가 가진 값 형식(Value Type)과 참조형식(Reference Type)의 복제 방식에 따라 얕은복사와 깊은복사로 개념이 나뉜다.

* 얕은 복사(Shallow Copy)

참조하는 것으로 값 자체를 복사해 놓은 것이 아니기 때문에 참조하는 것을 삭제할 경우를 잘 고려해야한다. ex) 복사생성자

* 깊은 복사(Deep Copy)

값 자체를 복사하는 경우로서 각각 다른 메모리 공간을 할당하기 때문에 얕은 복사에서와 같은 삭제시의 문제점은 없다.


'기초' 카테고리의 다른 글

int arr[2][3]의 대해서  (0) 2015.12.20
포인터, 2차원 배열  (0) 2015.12.19
포인터, 배열  (0) 2015.12.19
포인터 기초(초기화 문제, 크기)  (0) 2015.12.19
포인터 복습(&,*)  (0) 2015.12.18
posted by 알쿠미