C++ 학습: 기초 복습

정렬

1차원 배열의 길이 찾기:

double x[10];

sizeof(x) / sizeof(x[0]);

2차원 배열의 행 수 찾기:

double x[5][5];
sizeof(x) / sizeof[x[0]];

sizeof(x) / sizeof(x[0][0]);

바늘

32비트 시스템에서 포인터 유형은 포인터 유형에 관계없이 4바이트의 공간을 차지하며,
64비트 시스템에서 포인터 유형은 포인터 유형에 관계없이 8바이트의 공간을 차지합니다.

널 포인터

널 포인터 포인터 변수는 포인터를 초기화하는 데 사용되는 메모리의 0번 공간을 가리킵니다. 널 포인터가 가리키는 메모리에 액세스할 수 없음

와일드 포인터 포인터 변수는 잘못된 메모리 공간을 가리키므로 이러한 상황을 피하십시오.

//空指针定义
int * x = NULL;

포인터 산술

포인터 연산에는 ++, --, +, -가 포함될 수 있으며 포인터를 증가시켜 배열 요소에 액세스할 수 있습니다. 예를 들면 다음과 같습니다.

int arr[5] = {
    
    1, 2, 3, 4, 5};
int *p = arr;

for(int i = 0; i < 5; i++)
{
    
    
    cout << *p << endl;
    p++;
}

포인터 비교에는 >, <, ==가 포함됩니다.

int arr[5] = {
    
    1, 2, 3, 4, 5};

for(int *p = arr; p <= &arr[4]; p++)
{
    
    
    cout << *p << endl;
}

포인터 대 배열

배열의 이름은 포인터 상수이므로 배열의 데이터는 별표 형태로 수정할 수 있지만 배열의 주소는 수정할 수 없습니다. 좋다:

int x[3] = {
    
    1, 2, 3};
*x = 0;
cout << *x << endl;
// x++; 报错

인용하다

참조는 초기화해야 하며 초기화되면 변경할 수 없습니다.

포인터와 마찬가지로 참조는 &초기화될 때 기호 위치 측면에서 유연합니다. 다음 세 가지 방법은 동일합니다.

int x = 0;
int& y = x;
int & y = x;
int &y = x;
cout << y << endl;

참조는 일반적으로 함수의 매개 변수 또는 반환 값으로 사용됩니다.

기능

함수를 호출하는 방법에는 값에 의한 호출, 포인터에 의한 호출 및 참조에 의한 호출의 세 가지가 있습니다.

값에 의해 호출될 때 형식 매개변수는 실제 매개변수의 값을 변경하지 않습니다.

포인터에 의해 호출되면 형식 매개변수는 실제 매개변수의 값을 변경합니다. 형식 매개변수에 주소를 넘기므로 실제 매개변수를 직접 조작하는 형식 매개변수에 해당합니다.

참조에 의해 호출될 때 공식 매개변수는 실제 매개변수의 값도 변경합니다.

끊임없는

상수 정의

#define 전처리기를 사용합니다.

#define LENGTH 10 

const 키워드를 사용

const int LENGTH 10;

참고: 상수를 대문자로 정의하는 것은 좋은 프로그래밍 습관입니다.

포인터 상수 및 상수 포인터

포인터 상수: const
상수 포인터에 대한 포인터: const 포인터

누가 const를 수정하든 주로 별표에 따라 달라지며, const는 별표 왼쪽에 배치되어 포인터를 수정하고 const는 별표 오른쪽에 배치하여 포인터를 수정합니다.

이름은 별표를 구분선으로 사용하여 뒤에서 앞으로 부르고 별표를 "필요한 경우"로 번역할 수도 있습니다 to. 예를 들어 const int * p뒤에서부터 로 명명하면 pointer to const int정수 상수를 가리키는 포인터를 의미하므로 포인터가 가리키는 값은 수정할 수 없으며, 명명하면 int * const p정수 const point to int를 가리키는 상수 포인터, 포인터의 주소를 의미한다. 포인터는 변경할 수 없지만 가리키는 값은 가변적입니다.

위의 규칙에 따라 올바른 문법과 잘못된 문법을 쉽게 구분할 수 있습니다. 다음과 같이:

예 1:

int a = 100;
int b = 200;
const int * p = &a; //指向整型常量的指针,因此指针指向的值不可以改
//int const * p = &a; 二者等价

p = &b; //正确
// *p = 20; 报错,

예 2:

int a = 100;
int b = 200;
int * const p = &a; //指向整型的指针常量,因此指针的指向不可以变。

//p = &b; //报错
*p = 20; //正确

마지막으로 테스트:

1. const int p;	//整形常量p; const int
2. const int* p; //指向整形常量的指针p; pointer to const int
3. int const* p; //指向整型常量的指针p; pointer to const int
4. int * const p; //指向整形的常量指针p; const pointer to int
5. const int * const p; //指向整形常量的常量指针p; const pointer to const int
6. int const * const p; //指向整形常量的常量指针p; const pointer to const int

요약하면 누가 const에 의해 수정되었는지에 따라 둘 사이의 차이점에 대한 핵심은 구분선으로 별표라는 것을 알 수 있습니다.

구조

구조 정의

struct Student
{
    
    
    string name;
    int age;
};

Student stu; //第一种初始化方式:C++
struct Student stu2; //第二种初始化方式:C或C++

C++에서 위에서 언급한 정의 방법은 초기화 및 함수 매개변수 전달을 위해 첫 번째 방법을 사용할 수 있지만 C 언어에서는 두 번째 방법을 사용해야 합니다. 따라서 C언어와의 호환성을 위해 구조체 초기화 시 키워드를 생략할 수 있으며 struct다음과 같이 정의할 수 있다.

typedef struct Student
{
    
    
    string name;
    int age;
} Student;

이런 식으로 후속 Student는 Student 구조체의 별칭과 동일하며 Student는 초기화 중에 직접 사용할 수 있습니다.

구조체를 정의하고 나면 이후의 사용법은 기본적으로 다른 변수형과 동일합니다.

구조에 대한 포인터

구조체에 대한 포인터는 ->구조체의 내부 멤버에 액세스합니다. 예:

Student stu;
stu.name = "test";
stu.age = 17;

Student *p = &stu;

cout << p->name << endl << p->age << endl;

동적 메모리

스택: 함수 내에서 선언된 모든 변수는 스택 메모리를 차지합니다.
힙: 프로그램이 실행되는 동안 동적으로 메모리를 할당하는 데 사용할 수 있는 프로그램에서 사용하지 않는 메모리입니다. new 연산자는 힙 메모리를 동적으로 할당하는 데 사용되며 delete 연산자는 힙 메모리를 해제하는 데 사용됩니다. 좋다:

   //整型数据的动态内存分配
    int * p = NULL;
    p = new int;
    *p = 100;
    cout << *p << endl;
    
    delete p;

    //数组的动态内存分配
    int * p1 = NULL;
    p1 = new int[3];
    for(int i = 0; i < 3; i++)
    {
    
    
        p1[i] = i * i;
    }
    for(int i = 0; i < 3; i++)
    {
    
    
        cout << p[i] << endl;
    }

    delete[] p1;

참조

Supongo que te gusta

Origin blog.csdn.net/xuyangcao123/article/details/124782405
Recomendado
Clasificación