欢迎关注笔者,你的支持是持续更博的最大动力
本文将讨论:
- 不同类型数组输出所有元素区别(int[ ] v.s. char[ ] )
- 输出运算符 “<<” 对 char* 的重载
- 如何输出字符数组地址
回顾
由 一维数组与指针可了解到:
- p[n] 与 *(p+n) 等价
- p是指针,指向数组p的起始地址
- p的起始地址:p[0]的地址
输出数组元素(int)
假如有一个数组 int p[n];
那么怎么输出数组p的所有元素呢?答:要用到for循环,如下:
for (int i = 0; i < n; ++i)
cout << p[i] << " ";
不能直接输出整个数组吗?尝试:
cout << p;
输出结果:十六进制数
也就是p的起始地址值,因为一开始已提到:p是指针,指向数组p的起始地址。
但是,有一个例外:
输出数组元素(char)
运行下面代码:
int main(){
char name[] = "Jack"; //字符数组name,name类型:char *
cout << name[1] << endl;
cout << name << endl;
return 0;
}
输出结果:
a
Jack
可以发现,对于字符数组,cout可以输出:
- p[i]:任意元素 (name[1])
- p:所有元素 (name),不需要for循环
这是为什么呢?
“<<”运算符对char *的重载
原因:输出运算符“<<”对于字符数组char[ ]有重载,这是一个特例,只有字符数组会输出整个数组,如果是int数组或者别的类型数组,则不会。
重载代码如下:
ostream& operator << (ostream& output, char *c)
{
while (*c != '\0') //输出'\0'之前的所有字符
{
output << *c;
c = c + sizeof(char);
}
return output;
}
那如何输出字符数组p地址?答:
方法1: 强制转换
cout << (void *)p << endl;
解释:1. 将char* 类型的p指针,强制转换为void*(无类型指针); 2. 利用输出运算符“<<”对无类型指针的重载,可以直接输出地址。
或更简单的,用取地址运算符“&”:
方法2:“&”
cout << &p <<endl;
相关内容
- 什么是指针、内存地址和空指针
- 指针相关:交换两个变量的值(图解)
- 一维数组、二维数组与指针(reverse函数举例)
- 指针与字符串,读取字符串,字符串库函数举例
- void指针是什么、区别、作用(memset,memcpy函数举例)
其他
日常vlog: 点这里去B站~