str
是指针,为什么不使用str
进行输入和输出呢?不是*str
p
是指针,为什么要使用*p
进行输入和输出?不是p
。
#include<iostream>
using namespace std;
int main()
{
char* str = new char[20];
cin>>str;
cout<<str<<endl;
delete []str;
int* p = new int[3];
cin>>*p;
cout<<*p<<endl;
delete []p;
return 0;
}
运算符重载<<
和>>
分别对const char*
和char*
有特殊的重载,因为它们是以null结尾的C样式字符串。它们是与其他指针/其他数组相比被区别对待。
下面对所使用的语义进行一点比较:
cin >> str;
是指";将以null结尾的字符串读取到数组中,其中str
是指向第一个元素"的指针;。
cout << str;
是指";打印一个以null结尾的字符串,其中str
是指向第一个元素"的指针;。
然而,对于int*
等其他指针类型也有这样的语义。
cin >> p;
不起作用,不存在";读取int的阵列";,或";读取指针";,而
cin >> *p;
工作和手段;读取单个整数并将其存储在值CCD_ 14"中;,也就是说,数组中的第一个元素被修改了。
cout << p;
是指";打印指针的值";,再次因为对于int*
没有类似于"1"的特殊语义;打印int数组";。另一方面
cout << *p;
意思是";打印一个整数,即p
〃的值;,也就是说,数组中的第一个元素被打印出来。
char* str = new char[20];
cin>>str;
您将指向一系列字符的指针传递给cin
,因为cin
需要在指针指向的位置读取多个字符。
int* p = new int[3];
cin>>*p;
您通过引用将单个int传递给cin
,因为cin
应该读取单个int。没有读取int序列的功能,因为int序列不是常见的事情。然而,一个char序列是一个c字符串,也是一个典型的东西。这就是为什么cin
有一个重载来读取一个char指针。
最好重写这个代码片段
int* p = new int[3];
cin>>*p;
cout<<*p<<endl;
delete []p;
像
int* p = new int;
cin>>*p;
cout<<*p<<endl;
delete p;
因为在类型为int.的三个对象的分配数组中只使用了一个对象
在第一种情况下,您处理的是一个接受或存储字符串的字符数组。对于字符数组,例如运算符>gt;像一样声明
template<class charT, class traits>
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&,
charT*);
也就是说,运算符不仅需要访问数组的第一个字符,还需要使用指针算术访问数组的后续字符。运算符不会更改传递的指针。它会更改指针指向的类型字符的对象。
对于int类型的对象,运算符>gt;像一样声明
basic_istream<charT,traits>& operator>>(int& n);
通过引用传递标量对象以使用运算符对其进行更改就足够了。
由于指针是一个变量,其值是地址,因此*运算符可以访问所指向地址的值。示例:
char *str = new char[20];
str是一个指针,所以它有:
_地址&str = adress1
_值str = adress2
(它是地址,因为它是指针(
在这个地址2是连续地址上的20个字符,所以第一个字符将在地址2中,然后是下一个地址2+1,然后是地址2+2等
假设项目符号1中出现语法错误。
str
是一个指向字符的指针,但在这种情况下,它指向字符数组中的第一个字符。*str
是对单个字符(字节(的引用。指针可以通过传递数组开头的地址来传递字符串。我们保证能够增加该指针并取消引用它,以便访问以下字符
例如,strlen
就是这样工作的:
size_t strlen(char *p)
{
size_t len = 0;
while (*p++ != 0) len ++;
return len;
}
p
是指向int的指针的值,写入它没有任何意义。*p
是对数组第一个元素的引用,类型为int