2011-01-28 90 views
5

內容在此代碼:更改指針的變量

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

我怎樣才能改變指針變量的內容,到它是什麼指着?

而且,爲什麼我只是得到A作爲這個程序的輸出?

謝謝。

回答

11

您得到一個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" 

但是,在改變字符串的內容文字有不確定行爲Ç。所以你不應該那樣做。相反,您需要動態填充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 

字符串操作是不是在語言,如Ç那麼容易。由於您正在使用的語法,您似乎正在使用編譯器編譯代碼,因此您可能會嘗試使用string類,而不是使用指向char的指針來處理您的字符串。

1

您訪問*Name這是指第一個內存位置具有 我fyou想B打印*(Name+1)和等。

如果你想改變的內容,然後將值賦給*名稱或*(姓名+ 1)或任何你想要的地方。

+0

被警告:改變字符串文字是未定義的行爲 - 它們是一個非常好的理由 – Flexo 2011-01-28 11:27:06

4

您不應該嘗試改變const char *變量的內容。按定義它是不變的。如果你想要一個可變字符串,可以使用std :: string,或者分配一個char * buffer []。

1

改變name地址值,你可以切換到另一個字符串字面的地址:

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

這樣的名字仍然是一個指針爲const char。

0

您需要了解關於指針的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 

你的輸出是因爲*的名字是一個字符,一個你的指針指向,因此字符串中的第一個。