Я обнаружил, что большинство из нас (разработчиков) сталкиваются с проблемами при работе с указателями. возможно, из-за его контринтуитивности. В конце концов, это становится причиной ошибок.
В своем профессиональном опыте я также сталкивался с множеством проблем и тратил много времени на их устранение (даже ломал голову по выходным, чтобы уложиться в сроки проекта).
Теперь я понимаю, что если следовать основам и придерживаться их, можно сэкономить много драгоценного времени.
Думайте об указателе символа как об адресе в памяти (стеке), который может указывать на любое место.
Внимание:Безопасная сторона инициализирует его значением NULL и продолжит работу, иначе это может привести к сбою программы.
Давайте посмотрим/поиграем сейчас: -
- Указатель символа может указывать на строковый литерал, хранящийся в постоянной памяти, как показано ниже.
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. Допускается инкремент с использованием оператора ++.
Выводы:
- char * : адрес этого указателя может быть изменен, и содержимое строки, на которую он указывает, также может быть изменено с помощью этого указателя.
- const char *: может быть изменен только адрес этого указателя, содержимое строки, на которую он указывает, не может быть изменено.
- На практике разработчик должен использовать const char * там, где изменение содержимого НЕ ожидается. давайте возьмем пример функции strcpy, которая копирует строку, указанную источником, в место назначения. здесь исключение состоит в том, чтобы не изменять содержимое в источнике.
char* strcpy(char* destination, const char* source);
4. char * const: содержимое строки, на которую указывает этот указатель, можно изменить, но нельзя изменить адрес этого указателя.
5. const char * const: нельзя изменить ни местоположение этого указателя, ни содержимое строки, на которую он указывает. Хорошее чтение.
6. Указатели символов эффективно расходуют память. Длина символьного массива/строкового литерала не должна быть известна во время инициализации, разработчик должен следить за длиной и размером с помощью функций ex. strlen, размер
7. Разработчики должны быть более осторожными при работе с указателями символов из-за завершающего нулевого символа.
Промах может привести к несчастному случаю.