我正在尝试拿起我的C ++;我对指针和引用有基本的了解;但是当谈到指向数组的char指针时,似乎对我没什么用。
我这里有一小段代码(省略包含和命名空间语句),我在下面的评论中包含了我的问题:
我至少经历过5个关于SO的问题,试图理解它;但是那些答案并没有达到我预期的答案,而且可以帮助理解那里的实际问题。
你能否从表面上深入解释我在下面评论过的问题(所以请不要直接深入研究)?
int main(){
// 1 this is a char pointer to a char;
char * c = new char;
*c ='A';
cout << c << endl; // this gives me memory address;
cout << *c << endl;// this gives me the value in the memory address;
// 2 this is a char array initialised to value "world";
char d[6] = "world";
cout << d[0] << endl; // this gives me the first element of char array;
// 3 this is char pointer to char array (or array of char pointers)?
char * str = new char[6];
for(int i=0;i<6;i++){ //
str[i]=d[i]; // are we assigning the memory address (not value) of respective elements here?
} // can I just do: *str = "world"; what's the difference between initialising with value
// and declaring the pointer and then assign value?
char * strr = "morning";
char b[6] = "hello";
cout << b << endl;
cout << (*str)[i] << endl; // why? error: subscripts requires array or pointer type
cout << str[1] << endl;
cout << (*strr)[1] << endl; // why? error: subscripts requires array or pointer type
}
答案 0 :(得分:5)
// 1这是一个指向char的char指针;
右。
// 2这是一个初始化为“world”值的char数组;
对,“world \ 0”由编译器创建,并放在程序的只读存储区中。请注意,这称为字符串文字。然后将字符串复制到char
数组d
。
// 3这是char数组(或char指针数组)的char指针?
这是一个char指针yes,指向单个char
的指针。
//我们分配各自的内存地址(不是值) 元素在这里?
不,您要分配元素的值。这是允许的,因为str[i]
与*(str + i)
相同,因此您可以使用指针str
进行相同的“数组样式”访问。您正在循环使用char
分配的各个new
,并在char
数组d
中为其分配字符值。
//为什么?错误:下标需要数组或指针类型
因为您已经取消引用str
(指向6个元素char
数组的开头)而*
为char
,所以您尝试使用char
就像一个[1]
的数组一样没有意义。 *str
会给你'w'(第一个元素)。而str[1]
会给你*(str + 1)
这是'o'(第二个元素),不要加倍。
一个小的大注释,字符串文字属于const char[]
类型,而不是char[]
,它们被放置在只读存储器中,因此它们不能被程序改变(不要写信给他们)。
char * strr = "morning";
这非常非常糟糕,它将const char[]
视为char[]
,这已经在标准中暂时弃用了一段时间,根据当前标准,这甚至是非法的,但编译器仍然允许它出于某种原因。
因为编译器允许这样做,你可能会遇到一些令人讨厌的情况,比如试图修改字符串文字:
char * strr = "morning";
strr[0] = 'w'; // change to "worning"
这将尝试写入只读内存,这是未定义的行为,可能/希望会给你一个分段错误。简而言之,使用适当的类型让编译器在代码到达运行时之前阻止你:
const char * strr = "morning";
侧面注意:不要忘记delete
使用new
分配的任何内容。