728x90

C/C++언어에서 포인터(pointer)는 메모리의 주소를 저장하는 변수이며, 포인터 변수라고 부른다.

char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장하는 데 사용된다.


int a = 100; // 변수의 선언
int* ptr; // 포인터의 선언
ptr = &a; // 주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환


주소 연산자(&)
주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다.
'&'기호는 앰퍼샌드(ampersand)라고 읽으며, 번지 연산자라고도 불린다.


역참조 연산자(*)
역참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터가 가리키는 주소에 저장된 값을 반환한다.


포인터 선언

int* ptr; // 올바른 예

int* ptr1, ptr2; // 잘못된 예

int *ptr1, *ptr2; // 올바른 예

두개 이상의 int형 포인터를 선언하고 싶을 때에는 각각의 포인터 변수 이름 앞에 역참조 연산자(*)를 따로 사용하여 선언해야 한다.


int a = 7;         // 변수의 선언
int *ptr = &a;     // 포인터의 선언 및 주소 할당
int **pptr = &ptr; // 더블 포인터 : 포인터의 포인터


#include <stdio.h>

int main() {
    // 포인터(pointer) : 메모리의 주소를 저장하는 변수
    // 주소 연산자(&)와 역참조 연산자(*)
    // C++의 포인터는 본질적으로 안전하지 않으므로 부적절하게 사용시 응용 프로그램을 손상시키기 쉽다.

    int a = 20;
    int b = 10;

    int* ptr; // 포인터 변수 선언

    ptr = &a; // a 변수의 주소 할당

    printf("a의 값 : %d\n", a);
    // 주소에 %d 를 하면 경고 메시지를 출력하면서 %p를 사용하라고 나온다.
    printf("a의 주소값 : %p\n", &a); // 변수의 주소를 얻으려면 주소 연산자(&)를 사용한다
    printf("ptr에 저장된 값 : %p\n", ptr);
    printf("ptr이 가리키는 변수에 저장된 값 : %d\n", *ptr); // 역참조 연산자 *를 통해 포인터가 가리키는 주소의 값을 알 수 있다

    ptr = &b; // b변수의 주소값
    printf("ptr이 가리키는 변수에 저장된 값 : %d\n", *ptr); // 역참조 연산자 *를 통해 포인터가 가리키는 주소의 값을 알 수 있다
    printf("b의 값 : %d\n", b);

    *ptr = 30;
    printf("b의 값 : %d\n", b);

    printf("\n*****************\n\n");

    int** ptr_ptr;
    ptr_ptr = &ptr;

    printf("b의 값 : %d\n", b);
    printf("b의 주소값 : %p\n", &b);

    printf("ptr에 저장된 값(=주소) : %p\n", ptr);
    printf("ptr이 가리키는 변수에 저장된 값 : %d\n", *ptr);

    printf("ptr_ptr에 저장된 값 : %p\n", ptr_ptr);
    printf("**ptr_ptr이 가리키는 변수에 저장된 값 : %d\n", **ptr_ptr);

    printf("\n*****************\n\n");
    // 배열과 포인터의 관계

    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

    printf("arr의 값 : %p\n", arr); // arr[0] 의 주소값을 반환한다.
    // 배열 변수는 마치 포인터인 것처럼 배열의 첫 번째 요소의 주소를 갖고 있다.

    for (int i = 0; i < 10; i++) {
        printf("&arr[%d] = %p\n", i, &arr[i]);
        printf("arr + %d = %p\n", i, arr + i);
    }
    printf("\n");

    // 아래 3개의 for문은 모두 동일한 결과인 값을 반환한다.
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    for (int i = 0; i < 10; i++) {
        printf("%d ", *(arr + i));
    }
    printf("\n");

    for (int *ptr = arr; ptr < arr + 10; ptr++) {
        printf("%d ", *ptr); // 역참조 연산자 *를 통해 포인터가 가리키는 주소의 값을 알 수 있다
    }
    printf("\n");
}


실행결과 : 주소는 PC마다 다르므로 다르게 출력될 수 있다.


참고하면 도움이 되는 URL 링크

Java 개발자가 배우는 C++ 포인터와 참조형 데이터

https://github.com/HomoEfficio/dev-tips/blob/master/Java%20%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80%20%EB%B0%B0%EC%9A%B0%EB%8A%94%20C%2B%2B%20-%2002%20-%20%ED%8F%AC%EC%9D%B8%ED%84%B0%EC%99%80%20%EC%B0%B8%EC%A1%B0%ED%98%95%20%EB%8D%B0%EC%9D%B4%ED%84%B0.md


블로그 이미지

Link2Me

,
728x90

테스트 환경 : Visual Studio 2019 Community


동영상 강좌에 나오는 strcpy, strcat 함수는 에러를 뿌리면서 실행이 안된다.

strcpy_s, strcat_s 를 사용하라고 나온다.


#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    char str[100] = "Hello ";
    char stra[100];

    int len;
    len = strlen(str);
    printf("str의 문자열의 길이는 %d\n", len);

    strcpy_s(stra, str);
    printf("str2의 값 : %s\n", stra);

    strcat_s(str, "World!");
    printf("%s\n", str);

    char str3[] = "sample";
    char str4[] = "simple";

    int cmp = strcmp(str3, str4);
    // 둘다 같으면 0 반환, str3가 str4보다 앞에 있으면 -1, 뒤에 있으면 1을 반환
    // a가 i보다 앞에 있어 아스키코드값이 작기 때문에 -1이 반환한다.

    // 값을 비교할 때 보통 == 연산자를 이용하여 동일 여부를 비교한다.
    // 하지만 문자열의 경우 == 연산자를 사용하면 원치 않는 결과를 가져올 수 있다.
    // 이는 같은 값일지라도 저장된 메모리 주소가 다르기 때문이다.
    // char 배열을 이용한 문자열의 경우 변수는 주소를 가리키므로, strcmp()함수를 이용한다.
    // 하지만 C++ 에서는 string 문자열일 경우 == 연산자를 사용할 수 있다.

}



블로그 이미지

Link2Me

,
728x90

파스칼의 삼각형을 2차원 배열로 출력한 것이다.

위키백과 https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%8A%A4%EC%B9%BC%EC%9D%98_%EC%82%BC%EA%B0%81%ED%98%95 사이트에 자세한 설명이 나온다.


수학적으로, 이 구조는 파스칼의 법칙을 사용하여 아래와 같이 표현한다.

n 번째 줄의 k 번째 값을 라고 하면, 이 값은

으로 정의된다. 이때,


#include <stdio.h>

int main() {
    // 파스칼의 삼각형
    int p[19][19]; // 2차원 배열

    for (int n = 0; n < 19; n++) {
        for (int k = 0; k <= n; k++) {
            if (k == 0 || k == n) {
                p[n][k] = 1;
            }
            else {
                p[n][k] = p[n - 1][k - 1] + p[n - 1][k];
            }
            printf("%d ", p[n][k]);
        }
        printf("\n");
    }
   
}


블로그 이미지

Link2Me

,
728x90

본 내용은 Android 에서 C++ 을 연동하여 처리하는 것을 알아야 할 거 같아서 C 와 C++ 에 대한 기본 개념을 파악하고자 동영상 강좌를 들으면서 간략하게 필요한 부분을 정리해두는 것이라 체계적인 것과는 거리가 좀 있다.

Visual Studio 2019 Community 버전에서 테스트하고 기록해둔다.

 

체계적으로 차근차근 듣고자 한다면 두들낙서님의 C/C++강좌 https://www.youtube.com/results?search_query=C%2FC%2B%2B+%EA%B0%95%EC%A2%8C 를 참조하면 된다.

강좌 설명은 Visual Studio 2015 로 하는 것 같다.

 

C언어 기본 문법

 

#include <stdio.h>  // # 전처리기
 
int main() {
    printf("Hello, World!\n"); // \n 은 줄바꿈
    printf("%d + %d = %d\n"235);
    printf("%f\n"3.141592);
    printf("%.2f\n"3.141592); // 소수점 둘째짜리까지만 반올림해서 출력
    printf("%g\n"3.141592); // 실수 출력 (지수형태로도 출력)
 
    printf("%c %c %c\n",'a','b','c'); // %c : 문자 출력(알파벳, 숫자, 몇몇 기호, \n)
    printf("%s\n""안녕하세요"); // %s : 문자열 출력 (문자들이 열거) - 한글 출력 가능
 
    int a = 5// int : 정수형 변수로 4 bytes(32비트) 공간을 차지한다.
    int b = 3;
    printf("%d + %d = %d\n", a, b, a + b);
 
 
 
    int a1 = 5// int : 정수형 변수로 4 bytes 즉 32비트 공간을 차지한다.
    int b1 = 3;
    printf("%d + %d = %d\n", a1, b1, a1 + b1);
 
    int mok1 = a1 / b1; // 몫
    int namuji1 = a1 % b1; // 나머지
    printf("%d / %d = %d\n", a1, b1, mok1);
    printf("%d %% %d = %d\n", a1, b1, namuji1);
 
 
    float a2 = 9.8// float : 실수형 변수로 4 bytes(32비트) 공간을 차지한다.
    float b2 = 3.14// float 는 오차가 발생하여 double 형을 많이 사용한다.
    float hap2 = a2 + b2;
    float cha2 = a2 - b2;
    float mok2 = a2 / b2; // 나누기
    printf("%f + %f = %f\n", a2, b2, hap2);
    printf("%f - %f = %f\n", a2, b2, cha2);
    printf("%f / %f = %f\n", a2, b2, mok2);
 
    double a3 = 9.8// double : 실수형 변수로 8 bytes(64비트) 공간을 차지한다.
    double b3 = 3.14;
    double hap3 = a3 + b3;
    double cha3 = a3 - b3;
    double mok3 = a3 / b3; // 나누기
    printf("%f + %f = %f\n", a3, b3, hap3);
    printf("%f - %f = %f\n", a3, b3, cha3);
    printf("%f / %f = %f\n", a3, b3, mok3);
    // 부동소수점(floating point)
 
    /* 2진법
     100110(2) = 1*2^5 + 1*2^2 + 1*2^1 = 38
     int - 32bits(4bytes)
     37 = 100101(2)
     00000000 00000000 00000000 00100101 = 37
     11111111 11111111 11111111 11111111 = -1
    */
 
    /* 자료형 - 정수형, 실수형
       정수형
       char  (1바이트) - 문자를 담는데 쓰임
       short (2바이트)
       long  (4바이트)
       long long (8바이트)
       int   (시스템에 따라서 자동 결정, 대체로 long)
 
       실수형
       float  (4바이트)
       double (8바이트)
 
       unsigned, signed
          unsigned int a;
          unsigned double f;
 
      void : 리턴 값이 없는 함수의 자료형
 
      bool : 참, 거짓을 저장(= char)
    */
 
    printf("%d %d %d %d\n"sizeof(int), sizeof(char), sizeof(float), sizeof(double));
    // sizeof(x) : x의 크기를 알려 줌.
 
    int a4 = 3.14// 실수를 정수형 변수에 담을 수 없다. 소수점은 짤리고 3을 반환한다.
    double b4 = 10;
    printf("%d %f\n", a4, b4);
 
    // 형변환 : 자료형을 다른 자료형으로 바꾸는 작업
    int math = 90, korean = 95, english = 96;
    int sum = math + korean + english;
    double avg = sum / 3// 정수형 sum 앞에 강제로 형변환 (double)sum 으로 하면 값이 달라진다.
 
    printf("%f\n", avg); // 예상 93.666667, 결과 93.000000
    // 정수 / 정수 = 정수, 정수 + 정수 = 정수
    // 실수 / 정수 = 실수, 정수 + 실수 = 실수
    // 실수 / 실수 = 실수, 실수 + 실수 = 실수
   

 

#include <studio.h>
 
int main()
{
    // 포인터 크기는 64비트 컴파일시에는 8 byte = 84bit
    // 32비트 컴파일시에는 4 byte = 32 bit
    printf("void * sizeof : %d\n"sizeof(void*));
    printf("char * sizeof : %d\n"sizeof(char*));
    printf("int * sizeof : %d\n"sizeof(int*));
    printf("long * sizeof : %d\n"sizeof(long*));
    printf("float * sizeof : %d\n"sizeof(float*));
    printf("double * sizeof : %d\n"sizeof(double*));
 
    printf("===========================================\n");
 
    printf("char sizeof : %d\n"sizeof(char));
    printf("int sizeof : %d\n"sizeof(int));
    printf("long sizeof : %d\n"sizeof(long));
    printf("float sizeof : %d\n"sizeof(float));
    printf("double sizeof : %d\n"sizeof(double));
}
 

 

배열

#include <stdio.h>
 
int main() {
    // array
    int arr[] = { 31479-3 };
 
    for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

 

 

 

블로그 이미지

Link2Me

,