본문 바로가기

C++

c++ 8 (추가 개념 정리 / 피드백)

포인터와 주소값에 관련하여

  • 함수에서 포인터를 리턴하는 경우
  • 파라미터에서 포인터를 받는 경우
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>


int* foo(){// int*를 리턴하는 foo라는 함수, int*는 주소값 즉, 주소값을 리턴
    int a = 100;
    return &a; // a의 주소값은 int*로 리턴된다
}


int main (){
    
    int v = 100;
    int* pv = &v; // v는 pv가 됐다, &v 즉 주소값은 포인터 변수에 할당이 될 수 있다.
    return 0;
}

 

 

int main (){
    
    int v = 100;
    int* pv = &v; // &를 붙였을 때 주소값이 나온다 이 나온 주소값은 int*이다. 두개가 동일하다 타입이 같다
    return 0;
}

 

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>


void foo(int* pv){
   
}


int main (){
    
    int* a;
    foo(a); // 타입이 같으니 a를 집어넣을 수 있다.
    
    int v = 100;
    foo(&v); // &v를 하면 주소값이 나온다, 포인터가 아닐 경우 파라미터로 집어넣을 때는 &를 붙여아한다
    
    int* b = &v;
    // 변수의 이름에 &를 붙이면 int* 타입이다.
    
    return 0;
}

 

if 절의 예측 실행

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>


bool foo() {
    printf("call foo\n");
    return true;
}




int main (){
    
    if (true && true) { // if는 왼쪽 값과 오른쪽 값을 동시에 비교하느냐 : 그럴수도 있고 아닐수도 있다
        
    }
    
    if (false && true) { // false면 true를 실행하지 않고 그냥 끝내게 된다
        
    }
    
    if (false && foo()) {
        printf("하하\n"); // 이 함수는 절대 실행이 되지않는다. false를 보고 뒤쪽을 실행 안해도 되겠구나 하고 넘어감
    }
    
    if (false || foo()) {
        printf("하하\n"); // 잘 바뀌지않는 false 같은 구문들을 앞쪽에다가 집어 넣어주게 되면 if 절에서 검사를
        // 하게 되더라도 컴파일러가 유동적으로 판단 가능하여 최적하에서 이득을 가져갈 수 있다.
    }
    return 0;
}

 

재귀함수

  • 자기자신을 호출하는 함수를 재귀함수라고 한다.

반복문을 대처하기 위해 사용한다.

 

글자를 거꾸로 출력하는 예시

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>


void reserve(const char* str, int index){
    if(str[index] == '\0') return; // index 숫자의 위치가 문자열을 판단했을때 널문자라면 아무것도 안하고 종료
    else {
        reserve(str, index+1); // 널문자가 아닌 경우 다시 자기자신을 호출, 자기 자신을 호출할 때 인덱스에 1번 값을 더함
        printf("%c", str[index]); // 끝나고 나면 현재 위치의 값을 출력
    }
    
}
apple 입력시 a 출발 p 출발 식으로 한 글자씩 재귀함수 else 문으로 가 즉 자기자신을 계속 다시 호출하여 널 문자까지 돌아 뒤에서 부터 호출





int main (){
    char input[100];
    scanf("%99[^\n]s", input);
    
    reserve(input, 0);
    // 사용자로부터 문자열을 받은 다음에 그것에 0을 집어넣게 된다.
    
    return 0;
}