'C++'에 해당되는 글 2건

  1. 2008.08.30 C언어 pointer
  2. 2008.08.30 비주얼 스투디오 단축키

C언어 pointer


나름 포인터 어느정도 땟다고 생각해도 프로그래밍을 하다보면 끊임없이 마주치는 문제가

포인터 문제가 아닌가 싶다.

개학도 거의 다됬고 개학하면 과제도 해야하고 학과 공부도 해야 되서 막간을 이용해서

 다시 체계적으로 배우는 C언어 포인터 라는 책을 읽었다.

특별히 다시 정리해야 할 부분만 요약하면 다음과 같다.


사용자 삽입 이미지


++ , -- , & , * , type casting 단항자 등의 우선순위는 모두 같다.
우선순위가 같을때는 right to left 를 따른다.

int imsi[ 3] ; imsi와 같이 배열명은 배열의 시작위치 값을
값을 같을 가르킬 뿐이지 값을 저장할 수 없다.
즉 변수가 아니다.
따라서 imsi ++ , imsi --와 같은 연산은 할수 없다.

++변수 변수++ 의 의미
변수의 값을 1 증가시키거나(++) 감소시키는(--) 연산자로서 변수의 앞 또는 뒤에 붙여서 사용한다.
변수에 붙는 위치에 따라 의미가 극단적으로 달라지는데, 변수의 뒤에 오면
'문장의 실행이 끝난 다음에 변수를 증감시켜라'라는 의미이며,
(이거 너무 헷갈렸었다)
변수의 앞에 오면 '문장 실행 전에 변수를 증감시켜라'라는 의미이다.
그리고 반드시 변수에 사용되어어야 한다.

2차원 배열과 2차원 배열 포인터 변수 연결

int imsi[ 2 ][ 3 ] ;
int (*imsip)[ 3 ] ;
imsip = imsi ;
sizeof(*imsip) -> 4 * 3 = 12

포인터에 주소값을 할당하려 할 때 대상체를 무시한채 할당 할 수 없다.
int imsi[ 3 ] = { 3 , 4, 5 } ;
int (*imsip2)[ 2 ] = imsi -> 이건 에러다.

( imsi는 1차원 배열 , imsip2는 열이 2차원이고 열이 2차원인 배열을 가르킬 수 있다.)


//////////////////////////////////////////////////////////////
#include <iostream>

using std::cout ;
using std::endl ;

int main()
{   
    int imsi[ 3 ][ 2 ] = { 1, 3, 4, 5, 6, 7 } ;
    int (* imsip)[2] ;   
   
    imsip = imsi ;

     // 2개 모두가 같은 값을 가지고 있다.
    cout << imsip  << endl ;            //2차원 배열을 가르키는 주소            
    cout << *( imsip + 0 ) << endl ; //2차원 배열의 첫번째 행을 가르키는 주소

    int ** temp ;

    temp = new int *[ 3 ] ;

    for ( int i = 0 ; i < 3 ; i ++ )
    {
        temp [ i ] = new int [ 2 ] ;
    }

    // 다른 값을 가지고 있다.
    cout << temp << endl ;
    cout << temp[ 0 ] ;

    for ( int i = 0 ; i < 2 ; i ++ )
    {
        delete temp [ i ]  ;
    }

    delete  temp ;
}

//////////////////////////////////////////////////////////////


int (*imsi)[2]
int *temp[2]
imsi는 2차월 배열을 담을수 있는 2차월 배열 포인터 변수 이고 temp는 포인터 배열이다.
temp의 값은 바뀌지 않는다면 imsi는 2차원 배열의 주소를 가르킬수 있다.

int ** temp ; // 동적으로 할당해서 2차원 배열을 가질 수 있따.
int *temp1[2] ; // 포인터값을 저장 할 수 있는 1차원 배열
int ( * temp2)[ 2] ; //  2차원 배열값을 저장할 수 있는 2차월 배열 포인터


char * temp1 = "kin";
char temp2[] = "kin";

temp1은 포인터이기 때문에 메모리를 할당받고 temp2는 배열명이기 때문에
주소값을 할당 받을 수 없다. temp1[ 0 ] = 'a' 이건 에러다. 왜냐하면 "kin" 이 저장된
주소는 건드릴수 없는 상수 값이 저장되어 있기 때문이다.

imsi[ i ]  == * ( imsi + i )
i[ imsi ]  == * ( i + imsi )  // 이따구로 쓰는 사람 병신


NULL pointer는 0x00000000 ( 0번지 주소 ) 를 가르키는게 아니다. 어떠한 곳도 가르키지 않는 주소값을 나타낸다.

void pointer 어느 것이든 가리킬 수 있는 포인터이다.
- 어떠한 형 변환 없이도 void 형 포인터 변수에 대입이 가능하다.
- void pointer는 type casting을 한 후에 연산을 하여야 한다.

void point error

main()
{
    void imsi( void * temp ) ;
}

void imsi ( void temp [ ] )
{

}

//첨자 연산 역시 type cast가 필요하다. 첨자안에 숫자가 들어왔을때 몇 바이트씩 분기하여야 할지 알수가 없다.
신고
Comment 0 Trackback 0
Top

비주얼 스투디오 단축키

1. 빌드
선택영역빌드 - F7(전역)
선택영역다시빌드 - Ctrl + F7(전역
)

선택영역정리 - Ctrl + Shift + F7(전역)

솔루션빌드 - Ctrl + B(전역)

솔루션다시빌드 - Ctrl + Shitf + B(전역)

솔루션정리 - Ctrl + Alt + B(전역)

 

2. 디버그
다시시작 - Ctrl + Shift + F5(전역)

디버깅중지 - Shift + F5(전역)

디버깅하지않고시작 - Ctrl + F5(전역)

디스어셈블리 - Ctrl + Alt + D(전역)

디스어셈블리설정해제 - Ctrl + F11(전역)

레지스터 - Ctrl + Alt + G(전역)

메모리1~4 - Ctrl + Alt + M  1~4(전역)

모두중단 - Ctrl + Alt + Break(전역)

모든중단점지우기 - Ctrl + Shift + F9(전역)

스레드 - Ctrl + Alt + H(전역)

시작 - F5(전역)

자동 - Ctrl + Alt + V A(전역)

조사식1~4 - Ctrl + Alt + W 1~4(전역)

지역 - Ctrl + Alt + V L(전역)

중단점설정 - Ctrl + F9(전역)

중단점설정해제 - F9(전역)

커서까지실행 -> Ctrl + F10(전역)

코드변경내용적용 -> Alt + F10(전역)

프로시저나가기 -> Shift + F11(전역)

프로시저단위실행 -> F10

한단계씩코드실행 -> F11

호출스택 -> Ctrl + Alt + C

 

3. 보기
도구상자 -> Ctrl + Alt + X

리소스뷰 -> Ctrl + Shift + E

속성페이지 -> Shift + F4

솔루션탐색기 -> Ctrl + Alt + L

웹브라우저표시 -> Ctrl + Alt + R

클래스뷰 -> Ctrl + Shift + C

 

4. 빌드
선택영역다시빌드 -> Ctrl + F7

선택영역빌드 -> F7

선택영역정리 -> Ctrl + Shift + F7

솔루션다시빌드 -> Ctrl + Shift + B

솔루션빌드 -> Ctrl + B

취소 -> Ctrl + Break

 

5. 창
다음문서창 -> Ctrl + F6

도구창닫기 -> Shift + Esc

문서창닫기 -> Ctrl + F4

문서창활성화 -> Esc

이전문서창 -> Ctrl + Shift + F6

 

6. 파일
기존항목추가 -> Shift + Alt + A

모두저장 -> Ctrl + Shift + S

새프로젝트 -> Ctrl + Shift + N

새항목추가 -> Ctrl + Shift + A

선택한항목저장 -> Ctrl + S

파일열기 -> Ctrl + O

프로젝트열기 -> Ctrl + Shift + O

 

7. 편집
끝까지단어삭제 -> Ctrl + Del

다음단어까지선택 -> Ctrl + Shift + 오른화살표

다음단어로 -> Ctrl + 오른화살표

다음찾기선택 -> Ctrl + F3

단어자동완성 -> Alt + 오른화살표

대문자로 -> Ctrl + Shift + U

뒤로삭제 -> 백스페이스

멤버목록 -> Ctrl + J

문서끝까지 선택 -> Ctrl + Shift + End

문서끝으로 -> Ctrl + End

문서시작까지선택 -> Ctrl + Shift + Home

문서시작으로 -> Ctrl + Home

문자바꾸기 -> Ctrl + T

바꾸기 -> Ctrl + H

선언으로이동 -> Ctrl + F12

소문자로 -> Ctrl + U

시작까지단어삭제 -> Ctrl + 백스페이스

왼쪽으로컨트롤크기조정 -> Ctrl + Shift + 왼화살표

이동(줄이동) -> Ctrl + G

이전찾기 -> Shift + F3

정의로이동 -> F12

찾기 -> Ctrl + F

찾기콤보상자로이동 -> Ctrl + D

출력창의다음위치로이동 -> F4

출력창의이전위치로이동 -> F3

클립보드링순환 -> Ctrl + Shift + Ins

파일에서바꾸기 -> Ctrl + Shift + H

파일에서찾기 -> Ctrl + Shift + F

현재단어선택 -> Ctrl + W


8. 프로젝트

새폴더 -> Ctrl + Num1

시작프로젝트로설정 - Ctrl + Num0(전역)

 

9. 도구

옵션 - Ctrl + Num.(전역)

키보드사용자지정 - Ctrl + Num2(전역)

신고
Comment 0 Trackback 0
Top

prev 1 next