Я обнаружил, что большинство из нас (разработчиков) сталкиваются с проблемами при работе с указателями. возможно, из-за его контринтуитивности. В конце концов, это становится причиной ошибок.

В своем профессиональном опыте я также сталкивался с множеством проблем и тратил много времени на их устранение (даже ломал голову по выходным, чтобы уложиться в сроки проекта).

Теперь я понимаю, что если следовать основам и придерживаться их, можно сэкономить много драгоценного времени.

Думайте об указателе символа как об адресе в памяти (стеке), который может указывать на любое место.

Внимание:Безопасная сторона инициализирует его значением NULL и продолжит работу, иначе это может привести к сбою программы.

Давайте посмотрим/поиграем сейчас: -

  1. Указатель символа может указывать на строковый литерал, хранящийся в постоянной памяти, как показано ниже.
    char* ptr = "Delhi"; 
    //Basically, char  is a pointer to the (const)string literal.

    readonly Memory: D e l h i \0

2. Проверьте, куда указывает указатель символа.

    printf("p is pointing to %s", p); //c
    cout<<"p is pointing to"<<p; //c++

    Output: Delhi

3. Символьный указатель, который указывает на место, более поздний момент времени может указывать на другое место.

    char* ptr = "Delhi";
    ptr = "Mumbai";

    OutPut: Mumbai

3. Символьный указатель на постоянный массив символов может быть переназначен, но не может быть изменен.

Example 1:-
        const char* ptr = "Delhi"; 
        ptr = "Mumbai"; //Allowed
        ptr[1] = 'x'; //Not Allowed

        Output: Not Allowed OutPut: error: assignment of read-only location ‘*(char_ptr + 1)’
        
Example 2:-
        char place = 'A';
        const char* ptr = &place;//(char*)"Delhi";//(char*)"Delhi";
        *ptr = 'B'; // Not allowed

        Output: error: assignment of read-only location 

3.b Указатель const char* и указатель char const* одинаковы.

3.c постоянный Указатель символа не может быть переназначен другому местоположению, но значение символа, на которое указывает этот указатель, может быть изменено.

 Example 1:-
        char* const ptr = "Delhi"; //constant char pointer
        ptr = "Mumbai"; //Not Allowed

        Output: error: assignment of read-only variable

        ptr[1] = 'x'; //Not Allowed, Segmentation fault as trying to change string littral value

        Output: error: Segmentation fault
 Example 2:-
        char place = 'A';
        char* const ptr = &place;
        *ptr = 'B'; //Allowed
        OutPut: B

3.d Если вы хотите предотвратить содержимое строки/символа и указатель заморозки, то

        char place1[] = "Delhi";
        const char * const ptr = place1;
        str[4] = '!'; //Not allowed
        
        OutPut: error: assignment of read-only location
        
        char place2[] = "Hi";
        ptr = place2
        
        OutPut: error: assignment of read-only variable

4. Обход: линейное время, как показано ниже.

    char * ptr = "Delhi";
    for(int i = 0; i<strlen(char_ptr); i++){
        cout<< ptr[i] <<" ";
    }

    Output: D e l h i

5. Длина: strlen — это встроенная функция string.h, которая задает длину строки.

    char* ptr = "Delhi";
    cout<<"string length: "<<strlen(ptr)<<endl;

    Output: 5 //(null not considered)

6. Размер: размер указателя символа зависит от системы (4/8 байт).

    char* ptr = "Delhi";
    cout<<"sizeof ptr: "<<sizeof(ptr)<<endl;
    
    Output: 8 //64bit system, 4byte in 32bit system

7. Указатель символа ptr и &ptr не совпадают.

    char* ptr = "Delhi";
    cout<<ptr<<endl;
    
    Output: Delhi // value at location where pointer is pointing
    In C, printf("char_ptr: %p\n", char_ptr); //0x55852f62b004
    
    cout<<&char_ptr<<endl;

    OutPut: 0x7fff3b6e3f70 //address of char pointer
    In C, printf("&char_ptr: %p\n", &char_ptr); //0x7fff4ef81840

8. Допускается инкремент с использованием оператора ++.

Выводы:

  1. char * : адрес этого указателя может быть изменен, и содержимое строки, на которую он указывает, также может быть изменено с помощью этого указателя.
  2. const char *: может быть изменен только адрес этого указателя, содержимое строки, на которую он указывает, не может быть изменено.
  3. На практике разработчик должен использовать const char * там, где изменение содержимого НЕ ожидается. давайте возьмем пример функции strcpy, которая копирует строку, указанную источником, в место назначения. здесь исключение состоит в том, чтобы не изменять содержимое в источнике.
     char* strcpy(char* destination, const char* source);

4. char * const: содержимое строки, на которую указывает этот указатель, можно изменить, но нельзя изменить адрес этого указателя.

5. const char * const: нельзя изменить ни местоположение этого указателя, ни содержимое строки, на которую он указывает. Хорошее чтение.

6. Указатели символов эффективно расходуют память. Длина символьного массива/строкового литерала не должна быть известна во время инициализации, разработчик должен следить за длиной и размером с помощью функций ex. strlen, размер

7. Разработчики должны быть более осторожными при работе с указателями символов из-за завершающего нулевого символа.

Промах может привести к несчастному случаю.