Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Const pointer c

Что означает a const pointer-to-pointer в C и в C++?

Я знаю rule-of-thumb, чтобы читать декларации right-to-left, и я был совершенно уверен, что знаю, что происходит, пока коллега не сказал мне, что:

означает «ppMyStruct является указателем на const указатель на (изменяемый) MyStructure» (в C++).

Я бы подумал, что это означает «ppMyStruct- указатель на указатель на const MyStructure«. Я искал ответ в спецификации C++, но, видимо, у меня это не очень хорошо получается.

Что означает in в C++, и означает ли это то же самое в C?

7 Ответов

Ваш коллега ошибается. Это (не-const) указатель на (не-const) указатель на const MyStructure. Как в C, так и в C++.

В таких случаях инструмент cdecl (или c++decl) может быть полезным:

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

Это все альтернативы pointer-to-pointer с одним квалификатором const. Правило right-to-left можно использовать для расшифровки объявлений (по крайней мере, в C++; я не эксперт по C).

Ваш коллега ошибается, и это то же самое для C и C++. Попробовать следующее:

Visual C++ 2008 выдает следующие ошибки для последних двух строк:

Другой ответ уже указывал на » правило спирали по часовой стрелке «. Этот мне очень понравился — правда, немного замысловатый.

Как следствие других комментариев, не ставьте ‘const’ на первое место. Он действительно принадлежит к тому типу. Это бы сразу прояснило смысл, просто прочитайте его RTL как обычно:

Похожие вопросы:

Не могли бы вы, ребята, помочь мне решить следующую проблему? У меня есть функция C++ dll, и она будет вызвана другим приложением C#. Одна из необходимых мне функций заключается в следующем: struct.

Когда я сделал следующие заявления: int b; int c; int *b; int *c; Я получил следующий результат при компиляции: Примечание: Я использую консоль Cygwin, поэтому я не мог скопировать и вставить вывод.

Мне было интересно, когда мы используем указатель на указатель в C++ и почему нам нужно указывать на указатель? Я знаю, что когда мы указываем на указатель, это означает, что мы сохраняем адрес.

Это может показаться довольно старой школой, но я все еще не могу понять, почему следующая программа выдает ошибку сегментации. Любая помощь была бы очень кстати #include .

Я хотел бы знать, в чем разница между const ref и const pointer в c++. Когда я объявляю, что что-то должно быть const ref, могу ли я изменить его VALUE? или const идет на объект? Потому что я знаю.

Я прочитал вопрос, опубликованный на Почему у C++ нет конструктора const? Я все еще не понимаю, почему эта программа может компилироваться. И я попытался высказать свое мнение по этому вопросу, я не.

Когда я недавно посмотрел на какой-то отрывок о C указателях, я нашел кое-что интересное. Там было написано, что это такой код: char var[10]; char *pointer = &var; while(*pointer!=’’)<.

Я считаю, что я столкнулся с частью причины, по которой так много людей, похоже, путают const , что термин указатель const , который кажется несколько нелогичной номенклатурой, когда он.

Это законно, чтобы преобразовать a pointer-to-non-const в A pointer-to-const. Тогда почему не законно преобразовывать указатель на указатель не-const в указатель на указатель на const ? E.g., почему.

У меня есть структура данных, похожая на список, но я не мог использовать встроенные контейнеры (List<> и т. д.). Я хотел бы сохранить pointer to pointer aka tail, который указывает на хвост.

Constant pointer and pointer to constant in C

Quick links

Pointers are the most powerful as well as complex component of C programming. For newbies, it’s like learning rocket science in C. However, I have tried my best to simplify things.

In this ongoing series of C programming tutorial, I have explained many concepts related to pointers. Here in this section we will focus on some confusing pointer terminologies. We will learn and compare constant pointer with pointer to constant and constant pointer to constant.

What is constant pointer?

Similarly, constant pointer is a pointer variable whose value cannot be altered throughout the program. It does not allows modification of its value, however you can modify the value pointed by a pointer.

In other words, constant pointer is a pointer that can only point to single object throughout the program.

Syntax to declare constant pointer

Note: You must initialize a constant pointer at the time of its declaration.

Example to declare constant pointer

Note: We use const keyword to declare a constant pointer.

The compiler will generate compilation error on failure of any of the two conditions.

  1. You must initialize a constant pointer during its declaration.
  2. A constant pointer must not be re-assigned.

Example program to use constant pointer

Let us write an example program to demonstrate constant pointer in C.

Let us dry run the above program.

  • First, we declared two integer variable num1 , num2 and an integer constant pointer const_ptr that points to num1 .
  • The statement *const_ptr = 10; assigns 10 to num1 .
  • Next we tried re-assignment of constant pointer i.e. const_ptr = &num2; . The statement will generate compilation error, since a constant pointer can only point to single object throughout the program.
  • The last two printf() statements are used to test value of num1 .
Читать еще:  Как изменить размер слайда в powerpoint

On compilation it generates following error message.

What is pointer to constant?

Pointer to constant is a pointer that restricts modification of value pointed by the pointer. You can modify pointer value, but you cannot modify the value pointed by pointer.

Note: There is a minor difference between constant pointer and pointer to constant. A constant pointer can only point to single object throughout the program. You can, alter the value pointed by pointer, but cannot alter pointer value.

Whereas pointer to a constant cannot modify the value pointed by pointer, but can alter its value.

Syntax to declare pointer to constant

Example to declare pointer to constant

Example program to use pointer to constant

Let us demonstrate pointer to a constant using an example.

The above program generates compilation error, since we tried to assign value to read only memory location (i.e. the value pointed by the pointer). Below is the compilation error generated by *ptr_const = 100;

Note: Pointer to constant restricts modification of value pointed by the pointer. However, do not think that C compiler converts variable pointed by pointer as constant variable.

Pointer to constant does not allows you to modify the pointed value, using pointer. However, you can directly perform modification on variable (without using pointer).
For example,

What is constant pointer to constant?

A constant pointer to constant is a combination of constant pointer and pointer to constant. It is a pointer that does not allow modification of pointer value as well as value pointed by the pointer.

Syntax to declare constant pointer to constant

Example to declare constant pointer to constant

Example program to use constant pointer to constant

Let us demonstrate the concept of constant pointer to constant in C program.

The above program generates two compilation error. First in the statement ptr = &num2; since we tried to assign value to a constant pointer. Second in the statement *ptr = 100; since we tried to assign value pointed by a pointer to constant.

Difference between constant pointer, pointer to constant and constant pointer to constant

Okay so got basic picture of a constant pointer, pointer to constant and constant pointer to constant. Let us summarize the things for quick recap.

Постоянный указатель vs указатель на постоянное значение

121 rahmu [2012-04-10 18:37:00]

В чем разница между следующими объявлениями?

Чтобы понять разницу, я написал эту небольшую программу:

Я скомпилировал программу (с gcc 3.4) и запустил ее. Результат очень хорошо показывает разницу:

Однако мне пришлось написать небольшую программу, чтобы получить ответ. Если я уйду от машины (например, в интервью), я не смогу ответить на вопрос.

Может кто-нибудь объяснить, комментируя приведенный выше пример, как работает ключевое слово const ?

c pointers const

11 ответов

147 Решение Alok Save [2012-04-10 18:39:00]

означает, что указатель является постоянным и неизменным, но зато указанными данными нет.
Вы можете использовать const_cast (в С++) или c-style cast, чтобы отбросить константу в этом случае, поскольку сами данные не являются постоянными.

означает, что указанные данные не могут быть записаны с использованием указателя a. Используя приведение const_cast (С++) или c-style для отбрасывания константы в этом случае вызывает Undefined Поведение.

58 John Bode [2012-04-10 19:01:00]

*a доступен для записи, но a не является; другими словами, вы можете изменить значение, на которое указывает a , но вы не можете изменить a . a — постоянный указатель на char .

a доступен для записи, но *a не является; другими словами, вы можете изменить a (указывая его на новое место), но вы не можете изменить значение, на которое указывает a .

Обратите внимание, что это идентично

В этом случае a является указателем на const char .

57 AAT [2014-05-20 12:11:00]

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

Итак, с char *const a; у вас есть a , который является указателем const ( * ) на char . Другими словами, вы можете изменить char, на который указывает a , но вы не можете сделать a на что-то другое.

Наоборот, с const char* b; у вас есть b , который является указателем ( * ) на char , который равен const . Вы можете сделать b точку в любом char, который вам нравится, но вы не можете изменить значение этого char с помощью *b = . ; .

Вы также можете, конечно, иметь оба вкуса константы за один раз: const char *const c; .

Теперь вы знаете разницу между char * const a и const char * a . Много раз мы путаем, если его постоянный указатель или указатель на постоянную переменную.

Как это прочитать? Выполните следующий простой шаг, чтобы определить между двумя верхними.

Давайте посмотрим, как читать ниже декларации

читать справа налево

Теперь начните с a ,

1. рядом с a существует const .

— > Итак, a — это constant (. ) .

2. Теперь идите, вы получите *

— > Итак, a — это constant pointer to (. ) .

3. Идите вперед и там char

— > a является переменной constant pointer to character

Читать еще:  Access treeview примеры

Легко ли читать?

Сходство для второго объявления

Теперь снова начинаем с a ,

1. Рядом с a есть *

— > Итак, a — это pointer to (. )

2. Теперь существует char

— > поэтому a есть pointer character ,

Ну, это не имеет никакого смысла. Итак, перетасуйте pointer и character

— > поэтому a есть character pointer до (. )

3. Теперь у вас есть constant

— > поэтому a есть character pointer to constant variable

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

Самый простой способ понять разницу — подумать о разных возможностях. Есть два объекта для рассмотрения: указатель и объект, на которые указывает (в этом случае «a» — это имя указателя, указанный объект не указан, типа char). Возможны следующие варианты:

  • ничего не const
  • указатель const
  • объект, на который указывает объект const
  • и указатель, и указатель на объект являются константами.

Эти различные возможности могут быть выражены в C следующим образом:

  • char * a;
  • char * const a;
  • const char * a;
  • const char * const a;

Я надеюсь, что это иллюстрирует возможные различия

9 cnicutar [2012-04-10 18:39:00]

Первый — постоянный указатель на char, а второй — указатель на константу char. Вы не касались всех случаев в своем коде:

6 Barel [2015-08-03 15:14:00]

Сначала я объясню это в устной форме, а затем с примером:

Объект-указатель может быть объявлен как указатель const или указатель на объект const (или оба):

A указатель const нельзя переназначить, чтобы указать на другой объект из того, который он первоначально назначил, но его можно использовать для изменения объекта, на который он указывает (называемый «pointee» ).
Таким образом, ссылочные переменные являются альтернативным синтаксисом для constpointers.

A указатель на объект const, с другой стороны, можно переназначить, чтобы указать на другой объект того же типа или типа конвертируемого, но он не может использоваться для изменения какого-либо объекта.

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

Счастлив помочь! Удачи!

5 jack [2014-12-25 18:08:00]

Выше — отличные ответы. Вот простой способ запомнить это:

Теперь, если вы скажете «const a», указатель будет const. (т.е. char * const a;)

Если вы скажете «const * a», то значение будет const. (т.е. const char * a;)

Вы можете использовать утилиту cdecl или ее онлайн-версии, например http://www.lemoda.net/c/cdecl/

void (* x)(int (*[])()); это declare x as pointer to function (array of pointer to function returning int) returning void

1 B_San [2015-02-07 11:24:00]

Попытка ответить простым способом:

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

Попробуйте изменить адрес указателя, чтобы понять больше:

Это означает, что когда постоянный указатель указывает какую-то вещь навсегда.

указатель a указывает только b .

Однако вы можете изменить значение b например:

Указатель на константу:

Значение, указанное указателем, не может быть изменено.

Указывает указатель на постоянный символ. Например,

Здесь a указывает на константу char (‘s’, в этом случае). Вы не можете использовать a для изменения этого значения. Но это объявление не означает, что значение, на которое оно указывает, равно действительно константа, это просто означает, что значение является константой, поскольку речь идет о a . Вы можете напрямую изменить значение b , изменив значение b , но вы не можете косвенно изменить значение с помощью указателя a .

*a=’t’; //INVALID b=’t’ ; //VALID

Указывает постоянный указатель на char. Ограничения a указывают только на b , но это позволяет вам изменить значение b .

6.10 — Pointers and const

Pointing to const variables

So far, all of the pointers you’ve seen are non-const pointers to non-const values:

However, what happens if value is const?

The above snippet won’t compile — we can’t set a non-const pointer to a const variable. This makes sense: a const variable is one whose value can not be changed. Hypothetically, if we could set a non-const pointer to a const value, then we would be able to dereference the non-const pointer and change the value. That would violate the intention of const.

Pointer to const value

A pointer to a const value is a (non-const) pointer that points to a constant value.

To declare a pointer to a const value, use the const keyword before the data type:

In the above example, ptr points to a const int.

So far, so good, right? Now consider the following example:

A pointer to a constant variable can point to a non-constant variable (such as variable value in the example above). Think of it this way: a pointer to a constant variable treats the variable as constant when it is accessed through the pointer, regardless of whether the variable was initially defined as const or not.

Thus, the following is okay:

But the following is not:

Because a pointer to a const value is not const itself (it just points to a const value), the pointer can be redirected to point at other values:

Const pointers

We can also make a pointer itself constant. A const pointer is a pointer whose value can not be changed after initialization

To declare a const pointer, use the const keyword between the asterisk and the pointer name:

Just like a normal const variable, a const pointer must be initialized to a value upon declaration. This means a const pointer will always point to the same address. In the above case, ptr will always point to the address of value (until ptr goes out of scope and is destroyed).

Читать еще:  Как изменить формат презентации powerpoint

However, because the value being pointed to is still non-const, it is possible to change the value being pointed to via dereferencing the const pointer:

Const pointer to a const value

Finally, it is possible to declare a const pointer to a const value by using the const keyword both before the type and before the variable name:

A const pointer to a const value can not be set to point to another address, nor can the value it is pointing to be changed through the pointer.

Recapping

To summarize, you only need to remember 4 rules, and they are pretty logical:

  • A non-const pointer can be redirected to point to other addresses.
  • A const pointer always points to the same address, and this address can not be changed.
  • A pointer to a non-const value can change the value it is pointing to. These can not point to a const value.
  • A pointer to a const value treats the value as const (even if it is not), and thus can not change the value it is pointing to.

Keeping the declaration syntax straight can be challenging. Just remember that the type of value the pointer points to is always on the far left:

AticleWorld

aticleworld offer c tutorial,c programming,c courses and c++, microcontroller tips

Important Question Related to const pointer in C

If you are going to give an interview, definitely your interviewer asks the question-related to const pointer. In my previous article, I have already discussed the const qualifier and its functionality. If you have some confusion regarding the const in C or you are not familiar with the const qualifier then it’s my personal advice to you, first, you have to read about the const keyword before solving the below questions.

You can read the below articles,

In this article, I will only discuss some important questions related to the const pointer which is frequently asked by an interviewer in the interview. I have spent hours to collect these const pointer questions so I hope these questions will be helpful for you. If you have any doubts regarding these pointer const questions, then please write in the comment box. I will try to solve your problem.

Note: All const pointer programs are tested on the dev C++.

Below find the list of few const pointer questions:

Question 1:

[Error] assignment of read-only location ‘*ciData’

Explanation

ciData is the pointer to the constant integer, so we cannot change the value of the address which holds by ciData.

Question 2:

Error: Runtime error

Explanation

The “aticle” is a string literal, so when to try to compile the above program compiler does not throw the error but when you try to run the program. it will be the crash.

Question 3:

Output:

Explanation

In above example, pcName points to the constant character but itself is not constant.so we can increment the position of the pointer.

Question 4:

[Error] assignment of read-only location ‘*pcName’

Explanation

Here pointer points to character constant so we cannot replace the character.

Question 5:

[Error] increment of read-only variable ‘pcName’

Explanation

In the above example pointer itself constant so we cannot increment the pointer.

Question 6:

[Error] increment of read-only variable ‘pcName’

Explanation

In the above example pointer is constant and it also points a constant address and it.

Question 7:

OutPut:

Value before the change =5
Value after the change = 6

Explanation

I am lucky because of getting a valid result. According to C standard behavior of above code will be undefined. The output may be different on different machines.

Question 8:

Output:

Explanation

In above example, the pointer is not constant only pointed data is constant.

Question 9:

Output:

Explanation
In the above example, the indirection operator and pre-increment operator have the same priority level and associative is left-right. So *++p behave like *(++p) that is why now p point to a garbage data location.

Question 10:

[Error] increment of read-only location ‘*p’

Explanation

In the above example, the indirection operator and pre-increment operator have the same priority level and associative is left-right. Here ++*p behave like ++(*p), so when to compile this code compiler throws a compilation error because of pointer p point to a read-only address.

Question 11:

[Error] assignment of member ‘iAge’ in read-only object

Explanation

In the above example, when we have declared the union variable constant then all members of the union become constant associated to that object.

Question 12:

OutPut:

Explanation

In the above example, passing argument 1 of ‘strcpy’ discards ‘const’ qualifier from pointer target type.

Question 13:

Output:

arr[3] before calling function = 4
arr[3] after calling function = 11

Explanation

In the above example, passing argument 1 of ‘ReplaceValue’ discards ‘const’ qualifier from pointer target type

Ссылка на основную публикацию
Adblock
detector