Постоянные указатели, используемые в реальной жизни - PullRequest
0 голосов
/ 23 марта 2019

Уважаемое сообщество Stackoverflow

Я пытаюсь лучше понять указатели и натолкнулся на вопрос:

В: Когда мы можем использовать постоянный указатель? Приведите пример с реальным сценарием и приведите код.

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


Мой ответ:

1- Определение:

Постоянный указатель - это указатель, который не может изменить адрес, который он держит.

2- Пример:

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

3- Код:

int main(){
     const int* number = 032 ... ;
     bool found = false;

     Vector<int> contactList = { 031 ... , 032 ... , 072 ... };

     for(int i=0; i < contactList.size(); i++){
         if( *number == contactList[i]){
         valid = true;
         }
     }

     if(valid){
        cout<< "Number found"<<endl;
     } else{
        cout<< "Number NOT found"<<endl;
     }
  }

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Указатель на константный или константный указатель?

Вам нужно быть осторожным в способе определения константного указателя.Потому что указатель const не является указателем на const.

 static int table[10]; 
 const int* number = table;    // non const pointer to const
 int * const number2 = table;  // const pointer to non const

 number++;             // this is allowed  because the pointer is not const 
 *number += 2;         // this is NOT allowed because it's a pointer to const
 number2++;            // this is NOT allowed because the pointer is const
 *number2 +=2;         // this is allowed because the const pointer points to a non const

Кстати, будьте осторожны с ведущими 0, так как они означают восьмеричные обозначения:

 cout << 032 <<endl;   // displays 26 in decimal since 032 is octal notation

Указатели, адреса и значения

Помните о разнице междууказатель и значение, на которое указывает.К счастью, C ++ защищает вас от запрета:

 const int* number = 032;    // compiler error 

Если вы хотите сохранить указатель на определенное значение:

 int myvalue=032; 
 const int* number = &myvalue;     // ok as long as you remain in scope

Осторожно при указании на векторные элементы

И последнее, но не менее важное: если вы испытываете желание использовать указатель на элемент вектора, помните, что адрес элемента вектора может измениться (и указатели будут недействительными) в некоторых случаях, например, когда вектор должен расти.,

Пример того, что вы пытаетесь сделать

Теперь давайте соберем все это вместе и приведем немного измененную программу:

const int * number;    // const to avoid accidental overwrite
int search;            // value to search for
cout<<"What number are you looking for ? "; 
cin>>search;  

for(int i=0; i < contactList.size(); i++){
     if( contactList[i] == search){  // compare values
         number = &contactList[i];   // set pointer
         found = true;
     }
 }
 // if the vector is not modified,  you may use the pointer.  
 if(found){
    cout<< "Number found: "<< *number <<endl;
 } 
 else{
    cout<< "Number NOT found"<<endl;
 }
1 голос
/ 23 марта 2019

Во-первых, указатель const и указатель на const - это разные вещи:

сам указатель const является const.На него нельзя указать ничего, кроме того, на что он уже указывает, может быть изменено то, на что он указывает:

int i = 5;
int *const p1 = &i; // a const pointer
++*p1; // valid code. i is now 6
int j = 0;
p1 = &j; // error

указатель на const сам по себе может указывать на разные вещи, но он предполагает всеон указывает на const, поэтому он не позволяет изменять их:

int i = 5;
const int * p2 = &i; // a pointer to const
++*p2; // error
int j = 0;
p2 = &j; // valid code. p2 is now pointing to j

Я предполагаю, что ваш вопрос «Почему кто-то использует указатель, который предполагает, что все является const?».Там может быть много причин.Одним из них является то, что когда вы видите const int * в качестве параметра функции, вы знаете, что эта функция не будет связываться с вашей переменной.После того, как функция вернется, она останется прежней.По сути, именно поэтому мы и используем const.Вместо этого мы могли бы просто не изменять переменные, но, объявив их как const, мы знаем, что компилятор будет следить за тем, чтобы наши переменные не были изменены по ошибке, из-за недопонимания или чего-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...