Изменение содержимого указателя переменной - PullRequest
5 голосов
/ 28 января 2011

В этом коде:

#include <iostream>
int main()
{
const char* name = "Abc";
std::cout<<*name<<std::endl;
return 0;
}

Как я могу изменить содержимое переменной указателя, не на то, на что она указывает?

И почему я просто получаю A как вывод этой программы?

Спасибо.

Ответы [ 5 ]

11 голосов
/ 28 января 2011

Вы получаете char, потому что вы отменяете ссылку на указатель char*.

Вы можете изменить содержимое, выполнив:

*a = 'B'; // your char* would contain "Bbc"
a[0] = 'B'; // your char* would contain "Bbc"
a[1] = 'B'; // your char* would contain "ABc"
a[2] = 'B'; // your char* would contain "AbB"

Но, изменив содержимоестроковый литерал имеет неопределенное поведение в C .Так что не стоит этого делать.Вместо этого вам нужно заполнить char* динамически.Примерно так:

char *a;
a = malloc(sizeof(char)*100); // a string with a maximum of 99 chars
strcpy(a, "Abc");
// now you can safely change char* contents:
a[0] = '1';
a[1] = '1';
a[2] = '1';
printf("%s", a); // will print 111

Манипулирование строками не так просто в таких языках, как C .Поскольку по синтаксису, который вы используете, вы, кажется, компилируете свой код с помощью C ++ компилятора, тогда вы можете попробовать string class вместо использования указателей на char для обработки ваших строк.1022 *

4 голосов
/ 28 января 2011

Вы не должны пытаться изменить содержимое переменной const char *. По определению это константа.Если вы хотите непостоянную строку, используйте std :: string или выделите вместо нее char * buffer [].

1 голос
/ 28 января 2011

чтобы изменить значение адреса name, вы можете изменить адрес другого строкового литерала:

const char* newname = "def";
name = newname;

так, чтобы имя все еще указывало на const char.

1 голос
/ 28 января 2011

ВЫ получаете доступ к *Name, что относится к первому месту в памяти, в котором есть AI, для которого вы хотите печатать B *(Name+1) и т. Д.

Если вы хотите изменить содержимое, тогда присвойте значение * Nameили * (Имя + 1) или где угодно.

0 голосов
/ 28 января 2011

Вы должны понимать const относительно указателей.

const char * означает указатель на данные, которые вы не можете изменить, но вы можете переместить указатель.

const char * name = "Abc";
name = "Def"; // allowed
name[1]='B'; // compiler error

Если выЕсли вам нужен указатель, который вы не можете переместить, используйте

 const char * const name = "Abc"; // cannot move to point at something else
 char data[] = "ghi";
 char * const name = &data[0]; 
 name[1] = 'H'; // permitted
 name = &data[1]; // not allowed as name is a constant pointer

Вывод: A, потому что * name - это символ, на который указывает ваш указатель, и, следовательно, первый в строке.

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