C++ 动态内存分配(char[] 和 int[])
C++ dynamic memory allocation (char[] and int[])
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;
}
因为指针是一个变量,它的值是一个地址,指向的地址的值可以被 * 运算符访问。
示例:
char *str = new char[20];
str 是一个指针,所以它有:
_地址&str = adress1
_ 一个值 str = adress2
(它是地址,因为它是一个指针)
而在这个地址2是连续地址上的20个字符,所以第一个字符将在地址地址2中,然后是下一个地址2+1,然后是地址2+2等。
假设项目符号 1 中存在语法错误。
str
是指向 char 的指针,但在本例中它指向此类数组中的第一个。 *str
是对单个字符(字节)的引用。指针可用于通过传递数组开头的地址来传递字符串。我们保证能够增加该指针并取消引用它以访问以下字符
例如strlen
可能是这样工作的:
size_t strlen(char *p)
{
size_t len = 0;
while (*p++ != 0) len ++;
return len;
}
p
是指向int的指针的值,写入它没有意义。 *p
是对数组第一个元素的引用,类型为 int
.
运算符重载 <<
和 >>
分别对 const char*
和 char*
有特殊重载,因为它们是 null-terminated C-style 字符串.他们是
处理方式与其他 pointers/other 数组不同。
下面是所用语义的一些比较:
cin >> str;
表示“将空终止字符串读入数组,其中 str
是指向第一个元素的指针”。
cout << str;
表示“打印一个空终止字符串,其中 str
是指向第一个元素的指针”。
然而,其他指针类型也有这样的语义,例如 int*
。
cin >> p;
行不通,没有“读取整数数组”或“读取指针”之类的东西,而
cin >> *p;
的工作原理是“读取单个整数并将其存储在 p
的值中”,即数组中的第一个元素被修改。
cout << p;
再次表示“打印指针的值”,因为 int*
没有像“打印整数数组”这样的特殊语义。另一方面
cout << *p;
意思是“打印一个整数,即p
的值”,即打印数组中的第一个元素。
char* str = new char[20];
cin>>str;
您正在将指向一系列字符的指针传递给 cin
,因为 cin
需要在指针指向的位置读取多个字符。
int* p = new int[3];
cin>>*p;
您通过引用将单个 int 传递给 cin
,因为 cin
应该读取单个 int。没有读取整数序列的读取功能,因为整数序列不是常见的东西。然而,一个字符序列是一个 c-string 并且是一个典型的东西。这就是为什么 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类型对象数组中只使用了一个对象
在第一种情况下,您正在处理接受或存储字符串的字符数组。例如,对于字符数组,运算符 >> 声明为
template<class charT, class traits>
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&,
charT*);
也就是说,运算符不仅需要访问数组的第一个字符,还需要使用指针算法访问数组的后续字符。操作员不会更改传递的指针。它改变了指针指向的类型字符的对象。
对于 int 类型的对象,运算符 >> 声明为
basic_istream<charT,traits>& operator>>(int& n);
通过引用传递标量对象以使用运算符更改它就足够了。
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;
}
因为指针是一个变量,它的值是一个地址,指向的地址的值可以被 * 运算符访问。 示例:
char *str = new char[20];
str 是一个指针,所以它有:
_地址&str = adress1
_ 一个值 str = adress2
(它是地址,因为它是一个指针)
而在这个地址2是连续地址上的20个字符,所以第一个字符将在地址地址2中,然后是下一个地址2+1,然后是地址2+2等。
假设项目符号 1 中存在语法错误。
str
是指向 char 的指针,但在本例中它指向此类数组中的第一个。*str
是对单个字符(字节)的引用。指针可用于通过传递数组开头的地址来传递字符串。我们保证能够增加该指针并取消引用它以访问以下字符
例如strlen
可能是这样工作的:
size_t strlen(char *p)
{
size_t len = 0;
while (*p++ != 0) len ++;
return len;
}
p
是指向int的指针的值,写入它没有意义。*p
是对数组第一个元素的引用,类型为int
.
运算符重载 <<
和 >>
分别对 const char*
和 char*
有特殊重载,因为它们是 null-terminated C-style 字符串.他们是
处理方式与其他 pointers/other 数组不同。
下面是所用语义的一些比较:
cin >> str;
表示“将空终止字符串读入数组,其中 str
是指向第一个元素的指针”。
cout << str;
表示“打印一个空终止字符串,其中 str
是指向第一个元素的指针”。
然而,其他指针类型也有这样的语义,例如 int*
。
cin >> p;
行不通,没有“读取整数数组”或“读取指针”之类的东西,而
cin >> *p;
的工作原理是“读取单个整数并将其存储在 p
的值中”,即数组中的第一个元素被修改。
cout << p;
再次表示“打印指针的值”,因为 int*
没有像“打印整数数组”这样的特殊语义。另一方面
cout << *p;
意思是“打印一个整数,即p
的值”,即打印数组中的第一个元素。
char* str = new char[20];
cin>>str;
您正在将指向一系列字符的指针传递给 cin
,因为 cin
需要在指针指向的位置读取多个字符。
int* p = new int[3];
cin>>*p;
您通过引用将单个 int 传递给 cin
,因为 cin
应该读取单个 int。没有读取整数序列的读取功能,因为整数序列不是常见的东西。然而,一个字符序列是一个 c-string 并且是一个典型的东西。这就是为什么 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类型对象数组中只使用了一个对象
在第一种情况下,您正在处理接受或存储字符串的字符数组。例如,对于字符数组,运算符 >> 声明为
template<class charT, class traits>
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&,
charT*);
也就是说,运算符不仅需要访问数组的第一个字符,还需要使用指针算法访问数组的后续字符。操作员不会更改传递的指针。它改变了指针指向的类型字符的对象。
对于 int 类型的对象,运算符 >> 声明为
basic_istream<charT,traits>& operator>>(int& n);
通过引用传递标量对象以使用运算符更改它就足够了。